perm filename LIBMAC.OLD[PAS,SYS]4 blob
sn#470633 filedate 1979-07-03 generic text, type C, neo UTF8
COMMENT ⊗ VALID 00042 PAGES
C REC PAGE DESCRIPTION
C00001 00001
C00005 00002
C00007 00003 TITLE FREE *** PROCEDURE FREE ***
C00009 00004 TITLE EXPO *** FUNCTION EXPO ***
C00011 00005 TITLE ROUND *** FUNCTION ROUND ***
C00013 00006
C00014 00007 TITLE RUNPGM *** PROCEDURE RUN ***
C00017 00008 TITLE WRTSTR *** PROCEDURES WRTPST AND WRTUST ***
C00019 00009 TITLE NEW *** PROCEDURE NEW ***
C00021 00010 TITLE READC *** PROCEDURE READC ***
C00025 00011 TITLE WRTOCT *** PROCEDURE WRTOCT ***
C00028 00012 TITLE WRTHEX *** PROCEDURE WRTHEX ***
C00030 00013 TITLE WRTBOL *** PROCEDURE WRTBOL ***
C00033 00014 TITLE READR *** PROCEDURE READR ***
C00039 00015 TITLE TRUNC *** FUNCTION TRUNC ***
C00042 00016 TITLE INTREA *** FUNCTION INTREA ***
C00045 00017 TITLE WRITEC *** PROCEDURE WRITEC ***
C00047 00018 TITLE WRTREA *** PROCEDURE WRTREA ***
C00056 00019 TITLE WRTINT *** PROCEDURE WRTINT ***
C00059 00020
C00060 00021 TITLE READI *** PROCEDURE READI ***
C00062 00022 TITLE TTYOPN *** PROCEDURE TTYOPN ***
C00064 00023
C00065 00024 TITLE OPEN *** PROCEDURES RESET AND REWRITE ***
C00077 00025 TITLE REASTR *** PROCEDURES READS AND READPS ***
C00082 00026 TITLE CLOSE *** PROCEDURE CLSFIL ***
C00085 00027 TITLE PUT *** PROCEDURES PUT, PUTCH, PUTLN, PUTPG AND TMPCRW ***
C00095 00028 TITLE GET *** PROCEDURES GET, GETCH AND GETLN ***
C00106 00029 TITLE DATE *** PROCEDURE DATE ***
C00110 00030 TITLE TIME *** PROCEDURE TIME ***
C00113 00031 TITLE EXIT *** PROCEDURES WRTPC AND OTHER EXITS ***
C00118 00032 TITLE DEBSP *** DEBUG SUPPORT ***
C00128 00033
C00129 00034 TITLE WRTFNM *** PROCEDURES WRTFNM AND WRTSIX ***
C00133 00035 TITLE TMPTST *** PROCEDURE TMPTST ***
C00136 00036 TITLE ASTOSX *** PROCEDURE ASTOSX ***
C00138 00037 TITLE REAAUX *** PROCEDURES GETSGN, GETINT AND RTEST ***
C00143 00038 TITLE SETEOF *** PROCEDURE SETEOF ***
C00147 00039 TITLE WRTAUX *** PROCEDURES WRTBLK, TOOSML, WRTSGN AND WRTOPN ***
C00150 00040 TITLE FORER. *** PROCEDURE FORER. ***
C00151 00041 END
C00152 00042
C00153 ENDMK
C⊗;
;
; (C) COPYRIGHT H.-H. NAGEL
; INSTITUT FUER INFORMATIK
; DER UNIVERSITAET HAMBURG
; SCHLUETERSTRASSE 70
; 2000 HAMBURG 13
; GERMANY
; 1976
;
;*** PASCAL RUNTIME PROGRAM LIBRARY (18-AUG-76, KISICKI)
;
;*** DICTIONARY ***
;
;PAGE1 : DICTIONARY
;PAGE2 : FREE
;PAGE3 : EXPO
;PAGE4 : ROUND
;PAGE5 : ...
;PAGE6 : RUNPGM
;PAGE7 : WRTSTR
;PAGE8 : NEW
;PAGE9 : READC
;PAGE10: ...
;PAGE11: ...
;PAGE12: WRTOCT
;PAGE13: WRTHEX
;PAGE14: WRTBOL
;PAGE15: READR
;PAGE16: TRUNC
;PAGE17: INTREA
;PAGE18: WRITEC
;PAGE19: WRTREA
;PAGE20: WRTINT
;PAGE21: ...
;PAGE22: READI
;PAGE23: TTYOPN
;PAGE24: ...
;PAGE25: OPEN
;PAGE26: REASTR
;PAGE27: CLOSE
;PAGE28: PUT
;PAGE29: GET
;PAGE30: DATE.
;PAGE31: TIME.
;PAGE32: EXIT
;PAGE33: DEBSP
;PAGE34: ...
;PAGE35: WRTFNM
;PAGE36: TMPTST
;PAGE37: ASTOSX
;PAGE38: REAAUX
;PAGE39: SETEOF
;PAGE40: WRTAUX
;PAGE41: FORER.
TITLE FREE *** PROCEDURE FREE ***
TWOSEG
;
;*** ENTRY-POINTS ***
;
ENTRY FREE
;
;*** EXTERNAL-REFERENCES ***
;
EXTERN WRTPC
;
;*** REGISTER DEFINITION ***
;
AC0= 0
AC1= 1
REGIN= 1 ;INITILISATION OF REGISTERSTACK
REG= REGIN+1
REG1= REGIN+1+1
REG2= REGIN+1+2
REG3= REGIN+1+3
REG4= REGIN+1+4
REG5= REGIN+1+5
REG6= REGIN+1+6
NEWREG= 15
TOPP= 17
;
;*** ADDRESSES
;
.JBSA= 120
;
;*** START OF INVARIANT CODE
;
RELOC 400000
;
;*** PROCEDURE FREE
; - RESET NEWREG
; - <AC0>=VARIABLE TO BE RETAINED
; - AC1=LENGTH OF VARIABLE
;
FREE: CAIGE AC0 ,(NEWREG) ;A(VAR) >= NEWREG
JRST FREERR ;NO - INVALID ARG TO FREE
ADD AC0 ,AC1 ;NEW POSITION
HLRZ AC1 ,.JBSA ;NEW POS.
CAIL AC0 ,(AC1) ;< .JBSA
JRST FREERR ;NO - INVALID ARG TO FREE
HRRZ NEWREG ,AC0 ;RESET NEWREG
POPJ TOPP , ;RET TO CALLER
FREERR: OUTSTR [ASCIZ/
%? POINTER OUT OF BOUNDS: CANNOT RETAIN VARIABLE/]
JRST WRTPC
;
;*** LITERALS ***
;
LIT
PRGEND
TITLE EXPO *** FUNCTION EXPO ***
TWOSEG
;
;*** ENTRY-POINTS
;
ENTRY EXPO
;
;*** REGISTER DEFINITION ***
;
AC0= 0
AC1= 1
REGIN= 1 ;INITILISATION OF REGISTERSTACK
REG= REGIN+1
REG1= REGIN+1+1
REG2= REGIN+1+2
REG3= REGIN+1+3
REG4= REGIN+1+4
REG5= REGIN+1+5
REG6= REGIN+1+6
NEWREG= 15
TOPP= 17
;
;*** START OF INVARIANT CODE
;
RELOC 400000
;
;*** FUNCTION EXPO
; - RETURN THE EXPONENT OF A REAL VALUE
; - REG=REAL VALUE
; - 1(TOPP):=EXPONENT AS INTEGER
;
EXPO: JUMPGE REG ,.+2 ;POS. ARG.?
MOVM REG ,REG ;GET MAGNITUDE IF NOT
LDB REG ,[POINT 8,REG,8] ;GET EXPONENT
SUBI REG ,200 ;200 FOR EXPONENT
MOVEM REG ,1(TOPP) ;STORE FUNCTION RESULT
POPJ TOPP ,
;
;*** LITERALS
;
LIT
PRGEND
TITLE ROUND *** FUNCTION ROUND ***
TWOSEG
;
;*** ENTRY-POINTS
;
ENTRY ROUND
;
;*** EXTERNAL REFERENCES
;
EXTERN TRUNC
;
;*** REGISTER DEFINITION ***
;
AC0= 0
AC1= 1
REGIN= 1 ;INITILISATION OF REGISTERSTACK
REG= REGIN+1
REG1= REGIN+1+1
REG2= REGIN+1+2
REG3= REGIN+1+3
REG4= REGIN+1+4
REG5= REGIN+1+5
REG6= REGIN+1+6
NEWREG= 15
TOPP= 17
;
;*** START OF INVARIANT CODE
;
RELOC 400000
;
;*** FUNCTION ROUND
; - ROUND REAL VALUE TO NEAREST INTEGER
; - REG=REAL VALUE
; - 1(TOPP):=TRUNC(REG + 0.5)
;
ROUND: FADR REG ,[0.5] ;GET ARG. FOR TRUNC
PUSH TOPP ,REG1 ;SAVE REG1
MOVEI REG1 ,0 ;2ND ARG. FOR TRUNC
PUSHJ TOPP ,TRUNC ;CALL TRUNC
MOVE REG ,2(TOPP) ;GET RESULT FROM TRUNC
POP TOPP ,REG1 ;RESTORE REG1
MOVEM REG ,1(TOPP) ;STORE FUNCTION RESULT
POPJ TOPP , ;RETURN TO CALLER
;
;*** LITERALS
;
LIT
PRGEND
TITLE RUNPGM *** PROCEDURE RUN ***
TWOSEG
;
;*** ENTRY-POINTS ***
;
ENTRY RUNPGM
;
;*** EXTERNAL REFERENCES ***
;
EXTERN ASTOSX
EXTERN WRTSIX
EXTERN WRTPC
;
;*** REGISTER DEFINITION ***
;
AC0= 0
AC1= 1
REGIN= 1 ;INITILISATION OF REGISTERSTACK
REG= REGIN+1
REG1= REGIN+1+1
REG2= REGIN+1+2
REG3= REGIN+1+3
REG4= REGIN+1+4
REG5= REGIN+1+5
REG6= REGIN+1+6
NEWREG= 15
TOPP= 17
;
;*** START OF VARIANT CODE ***
;
RUNBLK: SIXBIT / /
SIXBIT / /
SIXBIT / /
XWD 0 ,0
XWD 0 ,0
XWD 0 ,0
;
;*** START OF INVARIANT CODE ***
;
RELOC 400000
;
;*** PROCEDURE RUN
; - ISSUE RUN-UUO
; - <REG>=ASCII/9 CHAR. FILENAME/
; - <REG1>=ASCII/6 CHAR. DEVICE/
; - REG2=PROJ.-PROG.-NR.
; - REG3=CORE REQUIREMENT
;
RUNPGM: MOVE AC0 ,[SIXBIT/SYS /] ;ASSUME
MOVEM AC0 ,RUNBLK ;SYS
JUMPE REG1 ,NODEV ;DEVICE?
MOVEI REG5 ,6 ;YES, SET LENGTH
MOVEI AC1 ,RUNBLK
PUSHJ TOPP ,ASTOSX ;AND CONV. TO SIXBIT
NODEV: HRRI REG1 ,(REG) ;ADDR OF FILENAME
MOVEI AC1 ,RUNBLK+1
MOVEI REG5 ,6
PUSHJ TOPP ,ASTOSX ;CONV. FILEN. TO SIXBIT
MOVEM REG2 ,RUNBLK+4
IMULI REG3 ,2000
HRRZM REG3 ,RUNBLK+5
HRLI AC1 ,1
HRRI AC1 ,RUNBLK
RUN AC1 , ;RUN SPECIFIED PROGRAM
RUNERR: OUTSTR [ASCIZ/
%? CANNOT RUN /]
MOVEI REG1 ,RUNBLK+1 ;PROGRAM'S NAME
PUSHJ TOPP ,WRTSIX ;WRITE OUT NAME
JRST WRTPC
;
;*** LITERALS
;
LIT
PRGEND
TITLE WRTSTR *** PROCEDURES WRTPST AND WRTUST ***
TWOSEG
;
;*** ENTRY-POINTS ***
;
ENTRY WRTPST
ENTRY WRTUST
ENTRY WRTPS1
ENTRY WRTUS1
;
;*** EXTERNAL REFERENCES ***
;
EXTERN PUTCH
;
;*** REGISTER DEFINITION ***
;
AC0= 0
AC1= 1
REGIN= 1 ;INITILISATION OF REGISTERSTACK
REG= REGIN+1
REG1= REGIN+1+1
REG2= REGIN+1+2
REG3= REGIN+1+3
REG4= REGIN+1+4
REG5= REGIN+1+5
REG6= REGIN+1+6
NEWREG= 15
TOPP= 17
;
;*** START OF INVARIANT CODE ***
;
RELOC 400000
;
;*** PROCEDURE WRTPST/WRTUST
; - WRITE PACKED STRING/STRING
; - <REG1>=STRING
; - REG2=TOTAL LENGTH OF OUTPUT
; - REG3=LENGTH OF STRING
;
WRTPS1: MOVE REG2 ,REG3 ;DEFAULT LENGTH
JRST WRTPST
WRTUS1: MOVE REG2 ,REG3 ;DEFAULT LENGTH
JRST WRTUST
WRTPST: HRLI REG1 ,440700 ;WRITE PACKED STRING
JRST BLANK-1
WRTUST: HRLI REG1 ,444400
JUMPLE REG2 ,WRTRET ;FIELDWIDTH = 0 ?
BLANK: CAIG REG2 ,(REG3) ;LEADING BLANKS REQUESTED ?
JRST START ;NO
MOVEI AC0 ," "
PUSHJ TOPP ,PUTCH
SOJA REG2 ,BLANK ;MORE LEADING BLANKS ?
START: ILDB AC0 ,REG1
PUSHJ TOPP ,PUTCH
SOJG REG2 ,START ;ANY CHARACTER LEFT ?
WRTRET: POPJ TOPP , ;NO - RETURN
;
;*** LITERALS ***
;
LIT
PRGEND
TITLE NEW *** PROCEDURE NEW ***
TWOSEG
;
;*** ENTRY-POINTS ***
;
ENTRY NEW
;
;*** EXTERNAL REFERENCES ***
;
EXTERN WRTPC
;
;*** REGISTER DEFINITION ***
;
AC0= 0
AC1= 1
REGIN= 1 ;INITILISATION OF REGISTERSTACK
REG= REGIN+1
REG1= REGIN+1+1
REG2= REGIN+1+2
REG3= REGIN+1+3
REG4= REGIN+1+4
REG5= REGIN+1+5
RE@π⎇ REGIN+1+6
NEWREG= 15
TOPP= 17
;
;*** START OF INVARIANT CODE ***
;
RELOC 400000
;
;*** PROCEDURE NEW
; - ALLOCATE DYNAMIC VARIABLES
; - REG=LENGTH OF VARIABLE
; - <REG>:=VARIABLE
;
NEW: SUB NEWREG ,REG ;UPDATE NEWREG
CAIL NEWREG ,40(TOPP) ;40 LOCATIONS TO ACCOUNT FOR
;USE OF STACK BY RUNTIME SUPPORT
JRST ALLOC ;OK - ALLOCATE STORAGE
ADDI NEWREG ,(REG) ;RESET NEWREG ON OVERRUN
JRST NEWERR
ALLOC: HRR AC1 ,NEWREG
MOVN REG ,REG
HRL AC1 ,REG
CLEAR: SETZM (AC1) ;SET REQUESTED
AOBJN AC1 ,CLEAR ;STORAGE TO ZERO
MOVE REG ,NEWREG ;RETURN ADDR OF VARIABLE
POPJ TOPP ,
NEWERR: OUTSTR [ASCIZ/
%? HEAP OVERRUNS STACK: RETRY WITH MORE CORE/]
JRST WRTPC
;
;*** LITERALS
;
LIT
PRGEND
TITLE READC *** PROCEDURE READC ***
TWOSEG
;
;*** ENTRY-POINTS ***
;
ENTRY READC
;
;*** EXTERNAL REFERENCES ***
;
EXTERN GETCH
;
;*** REGISTER DEFINITION ***
;
AC0= 0
AC1= 1
REGIN= 1 ;INITILISATION OF REGISTERSTACK
REG= REGIN+1
REG1= REGIN+1+1
REG2= REGIN+1+2
REG3= REGIN+1+3
REG4= REGIN+1+4
REG5= REGIN+1+5
REG6= REGIN+1+6
NEWREG= 15
TOPP= 17
;
;*** DESCRIPTION OF PASCAL-FILEBLOCK (SEE PROCEDURE WRITEMC OF COMPILER) ***
;
FILPTR= 0
FILEOF= 1
FILEOL= 2
FILOPN= 3
FILLKP= 4
FILENT= 5
FILIN= 6
FILOUT= 7
FILCLS= 10
FILSTA= 11 ;.+0 FOR FILESTATUS
;.+1 FOR DEVICE
;.+2 FOR POINTER TO BUFFERHEADER
FILNAM= 14
FILEXT= 15
FILPRO= 16
FILPPN= 17
FILBFH= 20 ;BUFFER HEADER
FILBTP= 21 ;BYTE POINTER
FILBTC= 22 ;BYTE COUNT IN BUFFER
FILLNR= 23 ;IF ASCII MODE - LINENR IN ASCIICHARA
;CTERS
FILCNT= 24 ;LH= IF BINARY MODE : NEGATIVE NUMBE
;R OF WORDS IN COMPONENT
;IF ASCII MODE : CHARACTERCNT IN LIN
;E AND TAB INDICATOR
;RH= ADDRESS OF FIRST WORD IN COMPONE
;NT
FILCMP= 25 ;FIRST WORD OF COMPONENT
;
;*** START OF INVARIANT CODE ***
;
RELOC 400000
;
;*** PROCEDURE READC
; - READ SINGLE CHARACTER
; - <REG1>=CHAR
;
READC: MOVE AC0 ,FILCMP(REG)
MOVEM AC0 ,(REG1)
PUSHJ TOPP ,GETCH
POPJ TOPP ,
;
;*** LITERALS ***
;
LIT
PRGEND
TITLE WRTOCT *** PROCEDURE WRTOCT ***
TWOSEG
;
;*** ENTRY-POINTS ***
;
ENTRY WRTOCT
ENTRY WRTOC1
;
;*** EXTERNAL REFERENCES ***
;
EXTERN PUTCH
;
;*** REGISTER DEFINITION ***
;
AC0= 0
AC1= 1
REGIN= 1 ;INITILISATION OF REGISTERSTACK
REG= REGIN+1
REG1= REGIN+1+1
REG2= REGIN+1+2
REG3= REGIN+1+3
REG4= REGIN+1+4
REG5= REGIN+1+5
REG6= REGIN+1+6
NEWREG= 15
TOPP= 17
;
;*** START OF INVARIANT CODE ***
;
RELOC 400000
;
;*** PROCEDURE WRTOCT
; - WRITE OCTAL FORMAT
; - REG1=OCTAL NUMBER
; - REG2=TOTAL LENGTH OF OUTPUT
;
WRTOC1: HRRZI REG2 ,14 ;DEFAULT LENGTH 12
JRST OCTEST
WRTOCT: JUMPLE REG2 ,OCTRET ;FIELDWIDTH = 0 ?
WRTOIN: CAIG REG2 ,14 ;LEAD. BLKS. REQ.?
JRST OCTEST ;NO
MOVEI AC0 ," "
PUSHJ TOPP ,PUTCH
SOJA REG2 ,WRTOIN ;MORE BLANKS TO BE INSERTED ?
OCTEST: MOVE REG3 ,[POINT 3,REG1]
HRREI AC1 ,-14(REG2)
JUMPE AC1 ,OCTWRT ;LESS THAN 12 POSITIONS REQUIRED ?
IBP REG3 ;YES
AOJL AC1 ,.-1
OCTWRT: ILDB AC0 ,REG3 ;GET DIGIT
ADDI AC0 ,60 ;CONVERT TO ASCII
PUSHJ TOPP ,PUTCH
SOJG REG2 ,OCTWRT ;MORE DIGITS TO BE OUTPUT ?
OCTRET: POPJ TOPP , ;NO - RETURN
;
;*** LITERALS
;
LIT
PRGEND
TITLE WRTHEX *** PROCEDURE WRTHEX ***
TWOSEG
;
;*** ENTRY-POINTS ***
;
ENTRY WRTHEX
ENTRY WRTHX1
;
;*** EXTERNAL REFERENCES ***
;
EXTERN PUTCH
;
;*** REGISTER DEFINITION ***
;
AC0= 0
AC1= 1
REGIN= 1 ;INITILISATION OF REGISTERSTACK
REG= REGIN+1
REG1= REGIN+1+1
REG2= REGIN+1+2
REG3= REGIN+1+3
REG4= REGIN+1+4
REG5= REGIN+1+5
REG6= REGIN+1+6
NEWREG= 15
TOPP= 17
;
;*** START OF INVARIANT CODE ***
;
RELOC 400000
;
;*** PROCEDURE WRTHEX
; - WRITE SEDECIMAL NUMBER
; - REG1=HEXADECIMAL NUMBER
; - REG2=TOTAL LENGHT OF OUTPUT
;
WRTHX1: HRRZI REG2 ,11 ;DEFAULT LENGTH 9
JRST HEXTST
WRTHEX: JUMPLE REG2 ,HEXRET ;FIELD = 0?
WRTHIN: CAIG REG2 ,11 ;LEADING BLANKS REQUIRED?
JRST HEXTST ;NO
MOVEI AC0 ," "
PUSHJ TOPP ,PUTCH
SOJA REG2 ,WRTHIN
HEXTST: MOVE REG3 ,[POINT 4,REG1]
HRREI AC1 ,-11(REG2)
JUMPE AC1 ,HEXWRT ;LESS THEN 11 POSITIONS
IBP REG3 ;YES
AOJL AC1 ,.-1
HEXWRT: ILDB AC0 ,REG3
ADDI AC0 ,60
CAIL AC0 ,72 ;DIGIT?
ADDI AC0 ,7 ;NO LETTER
PUSHJ TOPP ,PUTCH
SOJG REG2 ,HEXWRT
HEXRET: POPJ TOPP ,
;
;*** LITERALS ***
;
LIT
PRGEND
TITLE WRTBOL *** PROCEDURE WRTBOL ***
TWOSEG
;
;*** ENTRY-POINTS ***
;
ENTRY WRTBOL
ENTRY WRTBO1
;
;*** EXTERNAL REFERENCES ***
;
EXTERN PUTCH
EXTERN WRTBLK
;
;*** REGISTER DEFINITION ***
;
AC0= 0
AC1= 1
REGIN= 1 ;INITILISATION OF REGISTERSTACK
REG= REGIN+1
REG1= REGIN+1+1
REG2= REGIN+1+2
REG3= REGIN+1+3
REG4= REGIN+1+4
REG5= REGIN+1+5
REG6= REGIN+1+6
NEWREG= 15
TOPP= 17
;
;*** START OF INVARIANT CODE ***
;
RELOC 400000
;
;*** PROCEDURE WRTBOL
; - WRITE BOOLEAN CONSTANT
; - REG1=BOOLEAN VARIABLE
; - REG2=TOTAL LENGTH OF OUTPUT
;
WRTBO1: HRRZI REG2 ,1 ;DEFAULT LENGTH 5
JRST BLANK
WRTBOL: CAIGE REG2 ,5 ;FORMAT GREATER OR EQUAL FIVE ?
JRST BSMALL ;NO - SMALL OUTPUT
SUBI REG2 ,5
BLANK: PUSHJ TOPP ,WRTBLK ;WRITES LEADING BLANKS IF ANY
MOVEI REG2 ,5 ;FIVE CHARACTERS ARE GIVEN OUT
MOVE REG3 ,[ASCII/FALSE/]
SKIPE REG1 ;TRUE OR FALSE? - SKIP IF FALSE
MOVE REG3 ,[ASCII/ TRUE/]
MOVE REG1 ,[POINT 7,REG3,-1]
ILDB AC0 ,REG1 ;GETS CHARACTER
PUSHJ TOPP ,PUTCH
SOJG REG2 ,.-2 ;MORE CHARACTERS?
POPJ TOPP , ;NO - RETURN
BSMALL: JUMPE REG2 ,BOLEND ;FIELDWIDTH = 0?
SUBI REG2 ,1
PUSHJ TOPP ,WRTBLK ;WRITES LEADING BLANKS IF ANY
MOVEI AC0 ,"F"
SKIPE REG1 ;TRUE OR FALSE? - SKIP IF FALSE
MOVEI AC0 ,"T"
PUSHJ TOPP ,PUTCH
BOLEND: POPJ TOPP ,
;
;*** LITERALS ***
;
LIT
PRGEND
TITLE READR *** PROCEDURE READR ***
TWOSEG
;
;*** ENTRY-POINTS ***
;
ENTRY READR
;
;*** EXTERNAL REFERENCES ***
;
;
EXTERN GETCH
EXTERN CONERR
EXTERN READI
EXTERN INTREA
EXTERN GETINT
EXTERN GETSGN
EXTERN RTEST
;*** REGISTER DEFINITION ***
;
AC0= 0
AC1= 1
REGIN= 1 ;INITILISATION OF REGISTERSTACK
REG= REGIN+1
REG1= REGIN+1+1
REG2= REGIN+1+2
REG3= REGIN+1+3
REG4= REGIN+1+4
REG5= REGIN+1+5
REG6= REGIN+1+6
NEWREG= 15
TOPP= 17
;
;*** DESCRIPTION OF PASCAL-FILEBLOCK (SEE PROCEDURE WRITEMC OF COMPILER) ***
;
FILPTR= 0
FILEOF= 1
FILEOL= 2
FILOPN= 3
FILLKP= 4
FILENT= 5
FILIN= 6
FILOUT= 7
FILCLS= 10
FILSTA= 11 ;.+0 FOR FILESTATUS
;.+1 FOR DEVICE
;.+2 FOR POINTER TO BUFFERHEADER
FILNAM= 14
FILEXT= 15
FILPRO= 16
FILPPN= 17
FILBFH= 20 ;BUFFER HEADER
FILBTP= 21 ;BYTE POINTER
FILBTC= 22 ;BYTE COUNT IN BUFFER
FILLNR= 23 ;IF ASCII MODE - LINENR IN ASCIICHARA
;CTERS
FILCNT= 24 ;LH= IF BINARY MODE : NEGATIVE NUMBE
;R OF WORDS IN COMPONENT
;IF ASCII MODE : CHARACTERCNT IN LIN
;E AND TAB INDICATOR
;RH= ADDRESS OF FIRST WORD IN COMPONE
;NT
FILCMP= 25 ;FIRST WORD OF COMPONENT
;
;*** START OF INVARIANT CODE ***
;
RELOC 400000
;
;*** PROCEDURE READR
; - READ REAL FORMAT
; - <REG1>=REAL VALUE
; - REG2=TOTAL LENGTH OF OUTPUT
; - REG3=LENGTH OF FRACTION
;
READR: PUSHJ TOPP ,GETSGN ;GETS SIGN IF ANY AND FIRST COMPONET
;TO AC0
PUSHJ TOPP ,RTEST ;TEST IF FIRST COMPONENT IN DIGITS
;IF NOT ERROR - MESSAGE AND EXIT
PUSHJ TOPP ,GETINT ;GETS INTEGER BEFORE POINT TO REG2
MOVEI AC1 ,REG2 ;CONVERTS TO ASCII
PUSHJ TOPP ,INTREA
MOVE REG4 ,REG2 ;FURTHER WORKING FOR REAL ON REG4
SETZ REG6 , ;FOR DECIMAL EXPONENT
MOVE AC0 ,FILCMP(REG)
CAIE AC0 ,"." ;NOW HAS TO COME DECIMAL POINT
JRST CONERR ;NO POINT - ERROR MESSAGE AND EXIT
BEHPNT: SKIPE FILEOL(REG)
JRST REXP
PUSHJ TOPP ,GETCH
MOVE AC0 ,FILCMP(REG) ;GET NEXT COMPONENT
CAIG AC0 ,"9" ;IN DIGITS ?
CAIGE AC0 ,"0"
JRST REXP ;NO
SOJ REG6 , ;INCREMENT EXPONENT
FMPR REG4 ,[10.0]
SUBI AC0 ,"0" ;CONVERTS ASCII TO INTEGER
FSC AC0 ,233 ;CONVERTS INTEGER TO REAL
FADR REG4 ,AC0 ;ADD NEW DIGIT TO REST
JRST BEHPNT ;GET NEXT DIGITS IF ANY
REXP: SKIPL REG6 ;ONE OR MORE DIGITS BEHIND POINT ?
JRST CONERR ;NO - WRITE ERROR MESSAGE AND RETURN
MOVEI REG5 ,(REG3) ;SAVES SIGN
CAIE AC0 ,"E" ;DIGIT EQUAL E ?
JRST .+5 ;NO
SKIPN FILEOL(REG)
PUSHJ TOPP ,GETCH ;GET NEXT COMPONENT
PUSHJ TOPP ,READI ;GETS EXPONENT TO REG2
ADD REG6 ,REG2
JUMPL REG6 ,REXP1
SOJL REG6 ,REAOUT ;DEXIMAL EXPONENT EQUAL 0?
FMPR REG4 ,[10.0] ;NO - TOO LARGE - DIVIDIDE REAL VALUE
JRST .-2
REXP1: FDVR REG4 ,[10.0] ;NO - TOO SMALL - MULTIPLY REAL VALUE
AOJL REG6 ,.-1
REAOUT: JFCL 10 ,CONERR ;OVERFLOW - BIT SET ?
;IF SET JUMP TO CONERR
SKIPE REG5 ;SIGN EQUAL PLUS ?
MOVN REG4 ,REG4 ;NO - NEGATE REAL VALUE
MOVEM REG4 ,(REG1) ;STORE VALUE INTO VARIABLE
POPJ TOPP ,
;
;*** LITERALS ***
;
LIT
PRGEND
TITLE TRUNC *** FUNCTION TRUNC ***
TWOSEG
;
;*** ENTRY-POINTS ***
;
ENTRY TRUNC
;
;*** EXTERNAL REFERENCES ***
;
EXTERN INTREA
;
;*** REGISTER DEFINITION ***
;
AC0= 0
AC1= 1
REGIN= 1 ;INITILISATION OF REGISTERSTACK
REG= REGIN+1
REG1= REGIN+1+1
REG2= REGIN+1+2
REG3= REGIN+1+3
REG4= REGIN+1+4
REG5= REGIN+1+5
REG6= REGIN+1+6
NEWREG= 15
TOPP= 17
;
;*** START OF INVARIANT CODE ***
;
RELOC 400000
;
;*** FUNCTION TRUNC
; - CONVERT REAL TO INTEGER
; - REG=REAL VALUE
; - 1(TOPP):=[REG] AS INTEGER
;
TRUNC: SETZM 1(TOPP) ;CLEARS SIGN BIT
MOVE AC0 ,REG
JUMPGE AC0 ,POSVAL ;NEGATIVE NUMBER ?
AOS 1(TOPP) ;YES - SET SIGN BIT
MOVM AC0 ,AC0 ;MAKE IT POSITIVE
POSVAL: LDB REG ,[POINT 8,AC0,8] ;GETS EXPONENT
TLZ AC0 ,377000 ;RESET EXPONENT TO ZERO
SUBI REG ,233 ;200 FOR OFFSET, 33 FOR MANTISSE
SETZ AC1 , ;CLEAR AC1
ASHC AC0 ,(REG) ;AC0 := AC0 * 2 ** REG
SKIPN 1(TOPP) ;NEGATIVE SIGN ?
JRST READY ;NO - OVERJUMP
SKIPE AC1 ;REST EQUAL ZERO ?
AOS AC0 ;NO - INCREMENT
MOVN AC0 ,AC0 ;AND MAKE NEGATIVE
READY: MOVEM AC0 ,1(TOPP) ;STORE FUNCTION RESULT
POPJ TOPP , ;RETURN TO CALLER
;
;*** LITERALS ***
;
LIT
PRGEND
TITLE INTREA *** FUNCTION INTREA ***
TWOSEG
;
;*** ENTRY-POINTS ***
;
ENTRY INTREA
;
;*** EXTERNAL REFERENCES ***
;
;
;*** REGISTER DEFINITION ***
;
AC0= 0
AC1= 1
REGIN= 1 ;INITILISATION OF REGISTERSTACK
REG= REGIN+1
REG1= REGIN+1+1
REG2= REGIN+1+2
REG3= REGIN+1+3
REG4= REGIN+1+4
REG5= REGIN+1+5
REG6= REGIN+1+6
NEWREG= 15
TOPP= 17
;
;*** START OF INVARIANT CODE ***
;
RELOC 400000
;
;*** FUNCTION INTREA
; - CONVERT INTEGER TO REAL
; - <AC1>=INTEGER VALUE
; - <AC1>:=<AC1> AS REAL
;
INTREA: MOVE AC0 ,(AC1) ;GETS INTEGER TO AC0
JUMPGE AC0 ,.+3 ;VALUE NEGATIVE ?
TLO AC1 ,400000 ;SETS SIGN BIT
MOVM AC0 ,AC0 ;AC0 := ABS(AC0)
MOVEM AC1 ,1(TOPP) ;SAVES ADRESS AND SIGN BIT
JFFO AC0 ,.+2 ;WHERE IS THE FIRST "ONE"?
JRST .+7 ;AC0 CONTAINS ONLY ZERO'S
SUBI AC1 ,11 ;AC1 := NR OF LEADING 0'S - 9
JUMPGE AC1 ,.+4 ;BITS OF EXPONENT EQUAL ZERO ?
LSH AC0 ,(AC1) ;NO - SET ZERO
MOVM AC1 ,AC1 ;AND INCREMENT EXPONENT BY COUNT
JRST .+2
SETZ AC1 ,
ADDI AC1 ,233 ;AC1 CONTAINS UNNORMALIZED EXPONENT
FSC AC0 ,(AC1) ;CONVERTS TO NORMALIESRD REAL
MOVE AC1 ,1(TOPP) ;GETS SIGN BIT AND ADDRESS
SKIPGE AC1 ;SIGN BIT SET ?
MOVN AC0 ,AC0 ;YES - NEGATE REAL VALUE
MOVEM AC0 ,(AC1) ;STORE FUNCTION RESULT
POPJ TOPP , ;RETURN
;
;*** LITERALS ***
;
LIT
PRGEND
TITLE WRITEC *** PROCEDURE WRITEC ***
TWOSEG
;
;*** ENTRY-POINTS ***
;
ENTRY WRITEC
ENTRY WRITC1
;
;*** EXTERNAL REFERENCES ***
;
EXTERN PUTCH
;
;*** REGISTER DEFINITION ***
;
AC0= 0
AC1= 1
REGIN= 1 ;INITILISATION OF REGISTERSTACK
REG= REGIN+1
REG1= REGIN+1+1
REG2= REGIN+1+2
REG3= REGIN+1+3
REG4= REGIN+1+4
REG5= REGIN+1+5
REG6= REGIN+1+6
NEWREG= 15
TOPP= 17
;
;*** START OF INVARIANT CODE ***
;
RELOC 400000
;
;*** PROCEDURE WRITEC
; - WRITE A SINGLE CHAR
; - REG1=CHAR
; - REG2=NUMBER OF LEAD. BLANKS
;
WRITC1: HRRZI REG2 ,1 ;DEFAULT LENGTH 1
WRITEC: JUMPLE REG2 ,WRITRT ;FIELDWIDTH = 0 ?
SOJE REG2 ,PRINT ;LEADING BLANKS REQUESTED ?
LOOP: MOVEI AC0 ," " ;YES
PUSHJ TOPP ,PUTCH
SOJG REG2 ,LOOP ;MORE LEADING BLANKS ?
PRINT: MOVE AC0 ,REG1 ;CHAR TO BE OUTPUT INTO AC0
PUSHJ TOPP ,PUTCH
WRITRT: POPJ TOPP ,
;
;*** LITERALS ***
;
LIT
PRGEND
TITLE WRTREA *** PROCEDURE WRTREA ***
TWOSEG
;
;*** ENTRY-POINTS ***
;
ENTRY WRTREA
ENTRY WRTRE1
ENTRY WRTRE2
;
;*** EXTERNAL REFERENCES ***
;
EXTERN PUTCH
EXTERN WRTOPN
EXTERN WRTSGN
EXTERN WRTOPN
EXTERN TOOSML
EXTERN WRTBLK
EXTERN WRTINT
;
;*** REGISTER DEFINITION ***
;
AC0= 0
AC1= 1
REGIN= 1 ;INITILISATION OF REGISTERSTACK
REG= REGIN+1
REG1= REGIN+1+1
REG2= REGIN+1+2
REG3= REGIN+1+3
REG4= REGIN+1+4
REG5= REGIN+1+5
REG6= REGIN+1+6
NEWREG= 15
TOPP= 17
;
;*** START OF INVARIANT CODE ***
;
RELOC 400000
;
;*** PROCEDURE WRTREA
; - WRITE REAL FORMAT
; - REG1=REAL VALUE
; - REG2=TOTAL LENGTH OF OUTPUT
; - REG3=LENGTH OF FRACTION
;
WRTRE2: HRRZI REG2 ,20 ;DEFAULT LENGTH 16
WRTRE1: HRRZI REG3 ,123456 ;DEFAULT FLOATING REAL
JRST WRTREA
WRTMAT: SOJL REG5 ,.+4 ;MORE LEADING ZERO'S REQUEST
MOVEI AC0 ,"0" ;YES - WRITE THEM OUT
PUSHJ TOPP ,PUTCH
SOJG REG4 ,.-3 ;MORE LEADING ZERO'S BEFORE POINT ?
JUMPLE REG4 ,MATEND ;NO - MORE DIGITS BEFORE POINT ?
JUMPE REG1 ,.+7 ;MANTISSE EQUAL ZERO ?
LDB AC0 ,[POINT 9,REG1,8] ;NO - GET NEXT DIGIT
TLZ REG1 ,777000 ;RESETZ THIS BITS
IMULI REG1 ,12
ADDI AC0 ,"0" ;CONVERTS THEM TO ASCII
PUSHJ TOPP ,PUTCH
SOJG REG4 ,.-6 ;MORE DIGITS BEFORE POINT FROM REG1 ?
JUMPLE REG4 ,MATEND ;NO - MORE DIGITS BEFORE POINT ?
MOVEI AC0 ,"0" ;YES - WRITES ONE ZERO OUT
PUSHJ TOPP ,PUTCH
SOJG REG4 ,.-1
MATEND: POPJ TOPP ,
WRTREA: JUMPLE REG2 ,REARET ;FIELDWIDTH = 0?
PUSHJ TOPP ,WRTOPN ;SETS SIGN BIT AND PUTS FIELDWIDTH TO
; REG5
SETZ REG6 , ;TO SAVE DECIMAL EXPONENT
JUMPN REG1 ,.+3 ;VALUE EQUAL ZERO ?
MOVEI AC0 ,555555 ;YES - REMEMBER IT IN AC0
JRST WRTFF ;AND WRITE IT OUT
CAML REG1 ,[10.0] ;REAL VALEU SHOULD BE LESS THEN 10.0
JRST TOOBIG ;AND GREATER OR EQUAL THEN 1.0
CAML REG1 ,[1.0]
JRST NOWCOR ;NOW CORRECTLY POSITIONED
FMPR REG1 ,[10.0] ;IT'S TOO SMALL
SOJA REG6 ,.-3 ;EXPONENT BECOMES NEGATIV - CHECK AGA
;IN
TOOBIG: FDVR REG1 ,[10.0] ;REAL VALUE IS TOO LARGE
AOJ REG6 , ;EXPONENT BECOMES POSITIV
CAML REG1 ,[10.0] ;STILL TOO LARGE?
JRST TOOBIG ;YES
NOWCOR: LDB REG2 ,[POINT 8,REG1,8] ;GETS BINARY EXPONENT
SUBI REG2 ,200
TLZ REG1 ,377000 ;CLEARS EXPONENT
LSH REG1 ,(REG2) ;SHIFTS MANTISSE BY BINARY EXPONENT L
;EFT
WRTFF: CAIN REG3 ,123456 ;FIXEDREAL OR FLOATING REAL ?
JRST WRTFLO ;FLOATING REAL
MOVEI REG2 ,(REG5) ;FIXED REAL - GET FORMAT
SUBI REG2 ,(REG3) ;REG3 CONTAINS NR OF DIGITS AFTER POI
;NT
JUMPL REG6 ,.+7 ;EXPONENT NEGATIV ?
HRRI REG4 ,1(REG6) ;NOW REG4 CONTAINS NR OF DIGITS BEFOR
; POINT
CAIGE REG2 ,1(REG4) ;FORMAT LARGE ENOUGH ?
JRST WRTFLO ;NO - WRITES FLOATING FORMAT IF POSSI
;BLE
CAIE AC0 ,555555 ;VALUE EQUAL ZERO ?
SETZ REG5 , ;NO - NO LEADING ZERO'S
JRST .+5
CAIGE REG2 ,2
JRST TOOSML
HRRI REG4 ,1 ;ONE ZERO BEFORE POINT
MOVM REG5 ,REG6 ;NUMBER OF LEADING ZEROS'S
MOVEI REG6 ,765432 ;TO REMEMBER THAT NO EXPONENT SHALL
;BE GIVEN OUT
SUBI REG2 ,1(REG4) ;FOR POINT AND DIGITS BEFORE POINT
JRST WRTOUT
WRTFLO: HRRI REG4 ,1 ;ONE DIGIT BEFORE POINT
SETZ REG2 , ;NORMALLY NO LEADING BLANKS
TLNE REG4 ,400000 ;SIGN EQUAL MINUS ?
JRST .+3 ;NO
MOVEI REG2 ,1 ;ONE LEADING BLANK FOR PLUS
SUBI REG5 ,1 ;ACCOUNT IN FORMAT LENGTH
CAIGE REG5 ,7 ;FORMAT BIG ENOUGH ?
JRST TOOSML ;NO - WRITES "*" 'S INTO FORMAT AND R
;ETURN
MOVEI REG3 ,-6(REG5) ;DIGITS BEHIND POINT
CAIE AC0 ,555555 ;VALUE EQUAL ZERO ?
SETZ REG5 , ;NO - NO LEADING ZERO'S IN FLOATING F
;ORMAT
;<REG1>: VALUE OF MANTISSE
;<REG2>: NR OF LEADING BLANKS
;<REG3>: NR OF DIGITS BEHIND POINT
;<REG4>: NR OF DIGITS BEFORE POINT
;<REG5>: NR OF LEADING ZERO'S
WRTOUT: PUSHJ TOPP ,WRTBLK ;WRITES LEADING BLANKS
PUSHJ TOPP ,WRTSGN ;WRITES SIGN
PUSHJ TOPP ,WRTMAT ;WRITES MANTISSE BEFORE POINT
MOVEI AC0 ,"." ;WRITES DECIMAL POINT OUT
PUSHJ TOPP ,PUTCH
MOVEI REG4 ,(REG3)
PUSHJ TOPP ,WRTMAT ;WRITES MANTISSE BEHIND POINT
CAIN REG6 ,765432 ;WRITE EXPONENT OR NOT ?
JRST REARET ;NO
JUMPN REG6 ,.+3 ;EXPONENT EQUAL ZERO ?
MOVEI REG2 ,4 ;YES - WRITES BLANKS INSTEAD ZERO EXP
;ONENT
JRST WRTBLK ;AND RETURN TO SURCEPROGRAMM
MOVEI AC0 ,"E" ;YES - WRITE E OUT
PUSHJ TOPP ,PUTCH
MOVEI AC0 ,"+" ;WRITES SIGN OUT
SKIPGE REG6 ;EXPONENT POSITIV
MOVEI AC0 ,"-" ;NO - WRITE MINUS SIGN
PUSHJ TOPP ,PUTCH ;WRITES OUT SIGN
MOVM REG1 ,REG6 ;DEZIMAL EXPONENT TO REG1 - FOR WRITE
;INTEGER
MOVEI AC0 ,"0" ;TO WRITE ONE ZERO IF EXPONENT LESS T
;HAN 12
CAIGE REG1 ,12 ;EXPONENT GREATER 12
PUSHJ TOPP ,PUTCH ;NO - WRITE ONE ZERO OUT
MOVEI REG2 ,2 ;FORMAT - TWO DIGITS NORMALLY
CAIGE REG1 ,12 ;NEED MORE THAN ONE DIGIT ?
MOVEI REG2 ,1 ;NO - FORMAT ONLY ONE DIGIT
PUSHJ TOPP ,WRTINT ;WRITES DECIMAL EXPONENT OUT
REARET: POPJ TOPP , ;RETURN
;
;*** LITERALS ***
;
LIT
PRGEND
TITLE WRTINT *** PROCEDURE WRTINT ***
TWOSEG
;
;*** ENTRY-POINTS ***
;
ENTRY WRTINT
ENTRY WRTIN1
;
;*** EXTERNAL REFERENCES ***
;
EXTERN PUTCH
EXTERN TOOSML
EXTERN WRTBLK
EXTERN WRTSGN
EXTERN WRTOPN
;
;*** REGISTER DEFINITION ***
;
AC0= 0
AC1= 1
REGIN= 1 ;INITILISATION OF REGISTERSTACK
REG= REGIN+1
REG1= REGIN+1+1
REG2= REGIN+1+2
REG3= REGIN+1+3
REG4= REGIN+1+4
REG5= REGIN+1+5
REG6= REGIN+1+6
NEWREG= 15
TOPP= 17
;
;*** START OF INVARIANT CODE ***
;
RELOC 400000
;
;*** PROCEDURE WRTINT
; - WRITE INTEGER FORMAT
; - REG1=INTEGER VALUE
; - REG2=TOTAL LENGTH OF OUTPUT
;
WRTIN1: HRRZI REG2 ,14 ;SET DEFAULT LENGTH 12
WRTINT: JUMPLE REG2 ,INTRET ;FIELDWIDTH = 0?
PUSHJ TOPP ,WRTOPN
JUMPE REG1 ,.+4
IDIVI REG1 ,12 ;GETS LOWEST DIGIT TO REG2
PUSH TOPP ,REG2 ;AND SAVES IT IN PUSH-LIST
AOJA REG4 ,.-3
TRNE REG4 ,777777 ;VALUE EQUAL 0?
JRST .+4 ;NO
SETZ REG2 , ;YES - PUTS ONE ZERO INTO PUSH-LIST
PUSH TOPP ,REG2
AOJ REG4 ,
CAIL REG5 ,(REG4) ;FORMAT LARGE ENOUGH ?
JRST .+6 ;YES
TLZ REG4 ,400000 ;CLEARS SIGN BIT IF ANY
SOJL REG4 ,.+3 ;RESET PUSH-LIST
POP TOPP ,REG2
JRST .-2
JRST TOOSML ;WRITES "*" 'S INTO FORMAT AND RETURNS
SUBI REG5 ,(REG4) ;GETS NUMBER OF LEADING BLANKS
MOVEI REG2 ,(REG5) ;WRITEBLANK-ROUTINE WORKS ON REG2
PUSHJ TOPP ,WRTBLK ;WRITES BLANKS IF ANY
PUSHJ TOPP ,WRTSGN ;WRITES SIGN : " " IF POSITIV,"-" IF
;NEGATIV
POP TOPP ,AC0 ;GETS DIGIT IN PUSH-LIST
ADDI AC0 ,"0" ;CONVERTS TO ASCII
PUSHJ TOPP ,PUTCH ;WRITES THEM OUT
SOJG REG4 ,.-3 ;MORE DIGITS ?
INTRET: POPJ TOPP , ;NO - RETURN
;
;*** LITERALS ***
;
LIT
PRGEND
TITLE READI *** PROCEDURE READI ***
TWOSEG
;
;*** ENTRY-POINTS ***
;
ENTRY READI
;
;*** EXTERNAL REFERENCES ***
;
EXTERN GETSGN
EXTERN GETINT
EXTERN CONERR
EXTERN RTEST
;
;*** REGISTER DEFINITION ***
;
AC0= 0
AC1= 1
REGIN= 1 ;INITILISATION OF REGISTERSTACK
REG= REGIN+1
REG1= REGIN+1+1
REG2= REGIN+1+2
REG3= REGIN+1+3
REG4= REGIN+1+4
REG5= REGIN+1+5
REG6= REGIN+1+6
NEWREG= 15
TOPP= 17
;
;*** START OF INVARIANT CODE ***
;
RELOC 400000
;
;*** PROCEDURE READI
; - READ INTEGER NUMBER
; - <REG1>=INTEGER VARIABLE
;
READI: PUSHJ TOPP ,GETSGN ;GETS SIGN AND FIRST CHAR
PUSHJ TOPP ,RTEST ;TEST IF FIRST COMPONENT IN DIGITS
PUSHJ TOPP ,GETINT ;GETS INTEGER TO REG2
SKIPE REG3 ;SIGN EQUAL MINUS ?
MOVN REG2 ,REG2 ;YES - NEGATE INTEGER
JFCL 10 ,CONERR ;OVERFLOW BIT SET ?
MOVEM REG2 ,(REG1) ;PUTS INTEGER IN PLACE LOADED TO REG1
POPJ TOPP ,
;
;*** LITERALS ***
;
LIT
PRGEND
TITLE TTYOPN *** PROCEDURE TTYOPN ***
TWOSEG
;
;*** ENTRY-POINTS ***
;
ENTRY TTYOPN
;
;*** REGISTER DEFINITION ***
;
AC0= 0
AC1= 1
REGIN= 1 ;INITILISATION OF REGISTERSTACK
REG= REGIN+1
REG1= REGIN+1+1
REG2= REGIN+1+2
REG3= REGIN+1+3
REG4= REGIN+1+4
REG5= REGIN+1+5
REG6= REGIN+1+6
NEWREG= 15
TOPP= 17
;
;*** START OF INVARIANT CODE ***
;
RELOC 400000
;
;*** PROCEDURE TTYOPN
; - PROMPT PASCAL USER IF TTY-INPUT
; TO HIS PROGRAM IS REQUESTED
;
TTYOPN: OUTSTR [ASCIZ/
TO CONTINUE, HIT THE RETURN KEY */]
POPJ TOPP ,
;
;*** LITERALS
;
LIT
PRGEND
TITLE OPEN *** PROCEDURES RESET AND REWRITE ***
TWOSEG
;
;*** ENTRY-POINTS ***
;
ENTRY RESETF
ENTRY REWRIT
ENTRY TMPBLK
;
;*** EXTERNAL REFERENCES ***
;
EXTERN SETEOF
EXTERN GETCH
EXTERN GET
EXTERN ASTOSX
EXTERN WRTPC
EXTERN TMPTST
EXTERN WRTFNM
EXTERN GETLN
EXTERN CLSFIL
;
;*** REGISTER DEFINITION ***
;
AC0= 0
AC1= 1
REGIN= 1 ;INITILISATION OF REGISTERSTACK
REG= REGIN+1
REG1= REGIN+1+1
REG2= REGIN+1+2
REG3= REGIN+1+3
REG4= REGIN+1+4
REG5= REGIN+1+5
REG6= REGIN+1+6
NEWREG= 15
TOPP= 17
;
;*** DESCRIPTION OF PASCAL-FILEBLOCK (SEE PROCEDURE WRITEMC OF COMPILER) ***
;
FILDAT= 1 ;FLAG TO TEST FOR TEXT-FILE
FILBIN= 17 ;FLAG TO TEST FOR ASCII-MODE
FILPTR= 0 ;LH= PASCAL FILE FLAGS
;RH= PTR TO COMPONENT
FILEOF= 1
FILEOL= 2
FILOPN= 3
FILLKP= 4
FILENT= 5
FILIN= 6
FILOUT= 7
FILCLS= 10
FILSTA= 11 ;.+0 FOR FILESTATUS
;.+1 FOR DEVICE
;.+2 FOR POINTER TO BUFFERHEADER
FILNAM= 14
FILEXT= 15
FILPRO= 16
FILPPN= 17
FILBFH= 20 ;BUFFER HEADER
FILBTP= 21 ;BYTE POINTER
FILBTC= 22 ;BYTE COUNT IN BUFFER
FILLNR= 23 ;IF ASCII MODE - LINENR IN ASCIICHARA
;CTERS
FILCNT= 24 ;LH= IF BINARY MODE : NEGATIVE NUMBE
;R OF WORDS IN COMPONENT
;IF ASCII MODE : CHARACTERCNT IN LIN
;E AND TAB INDICATOR
;RH= ADDRESS OF FIRST WORD IN COMPONE
;NT
FILCMP= 25 ;FIRST WORD OF COMPONENT
;
;*** CONSTANTS ***
;
TMPSIZ= 200
;
;*** ADDRESSES ***
;
.JBFF= 121
.JBREL= 44
;
;*** START OF VARIANT CODE
;
TMPFLG: XWD 0 ,0
RESFLG: XWD 0 ,0
TMPBLK: SIXBIT / /
IOWD 0 ,0
;
;*** START OF INVARIANT CODE ***
;
RELOC 400000
;
;*** PROCEDURE RESETF
; - OPEN A FILE FOR INPUT
; - READ 1ST COMPONENT
; - <REG>=FILE-BLOCK
;
RESETF: HRRZI AC0 ,FILBFH(REG) ;INPUT BUFFER HEADER ADDRESS
SETOM RESFLG ;RESET IN PROGRESS
PUSHJ TOPP ,REOPEN ;CLOSE AND REOPEN FILE
MOVEI AC1 ,GETLN ;ADDR FOR ASCII-MODE
HLR AC0 ,FILPTR(REG) ;TEXT-FILE?
TRNE AC0 ,FILDAT ;SKIP IF YES
MOVEI AC1 ,GET ;ADDR FOR BINARY-MODE
SKIPE TMPFLG ;TEMPCORE-FILE OPEN?
JRST TMPSKP ;YES, SKIP LOOKUP
SKIPN FILEOF(REG)
PUSHJ TOPP ,RESLKP ;GO LOOKUP
JRST SETEOF ;ERROR ON LOOKUP OR OPEN
XCT FILIN(REG) ;SET UP INPUT BUFFER RING
SKIPA
JRST SETEOF ;NO FILE FOR NONDIRECTORY DEVICES
TMPSKP: SETZM TMPFLG ;TEMPCORE OPEN FINISHED
PUSHJ TOPP ,(AC1) ;GET FIRST COMPONENT (OR CHARACTER)
POPJ TOPP ,
RESLKP: PUSH TOPP ,FILPPN(REG) ;SAVE PPN CLOBBERED BY LOOKUP
XCT FILLKP(REG) ;LOOKUP
CAIA
AOS -1(TOPP)
POP TOPP ,FILPPN(REG) ;RESTORE PPN
POPJ TOPP ,
;
;*** PROCEDURE REWRITE
; - OPEN A FILE FOR OUTPUT
; - <REG>=FILE-BLOCK
;
REWRIT: HRLZI AC0 ,FILBFH(REG) ;OUTPUT BUFFER HEADER ADDR
SETZM RESFLG ;REWRITE IN PROGRESS
PUSHJ TOPP ,REOPEN ;CLOSE AND REOPEN FILE
AOSG FILEOF(REG) ;ERROR ON OPEN ?
JRST REWERR ;YES
PUSHJ TOPP ,REWENT ;GO ENTER
JRST REWERR ;ERROR ON ENTER
XCT FILOUT(REG) ;SET UP BUFFER RING
POPJ TOPP , ;OK - RETURN
REWERR: OUTSTR [ASCIZ/
%? NO ACCESS TO OR NO DISK SPACE FOR FILE /]
PUSHJ TOPP ,WRTFNM
OUTSTR [ASCIZ/: ERROR IN REWRITE/]
JRST WRTPC
REWENT: PUSH TOPP ,FILPPN(REG) ;SAVE PPN CLOBBERED BY ENTER
XCT FILENT(REG) ;ENTER
CAIA
AOS -1(TOPP)
POP TOPP ,FILPPN(REG) ;RESTORE PPN
POPJ TOPP ,
;
;*** PROCEDURE TEMPCR
; - ALLOCATE SPACE FOR TEMP-CORE BUFFER
; - ISSUE TMPCOR-UUO
; - FAKE BUFFER-HEADER
; - PREPARE OPEN FOR DISK-FILE IF UUO FAILS
; - <REG>=FILE-BLOCK
;
TEMPCR: SKIPN RESFLG ;RESET?
JRST TMPSW ;NO, REWRITE
HRRZ AC1 ,.JBFF ;1ST FREE WORD
HRRZ AC0 ,.JBREL ;END OF USER-CORE
CAIGE AC0 ,TMPSIZ(AC1) ;WILL BUFFER FIT?
JRST [
ADDI AC0 ,TMPSIZ ;CORE NEEDED TO AC1
CORE AC0 , ;GET ANOTHER K
JRST TMPER1 ;BULLSHIT
JRST .+1] ;BACK IN LINE
HRRM AC1 ,TMPBLK+1 ;BUFFER-ADDR TO CONT.-BLOCK
SOS TMPBLK+1 ;PROPER IOWD-FORMAT
MOVEI AC0 ,-TMPSIZ ;MAX READ-LENGTH
HRLM AC0 ,TMPBLK+1 ;TO CONT.-BLOCK
HRLI AC1 ,440700 ;ASCII-BYTE-PTR
HRR AC0 ,FILSTA(REG) ;ASCII-MODE?
TRNE AC0 ,FILBIN ;SKIP IF YES
HRLI AC1 ,444400 ;BINARY-BYTE-PTR IF NOT
MOVEM AC1 ,FILBTP(REG) ;BYTE-PTR TO BUFFER-HEADER
MOVE AC0 ,FILNAM(REG) ;FILNAME
MOVEM AC0 ,TMPBLK ;TO CONT.BLOCK
MOVE AC0 ,[XWD 2,TMPBLK] ;DO TEMPCORE-READ
TMPCOR AC0 , ;WITH DELETE
JRST TMPSW ;FAILED
ADDM AC0 ,.JBFF ;SAVE DATA FROM DELETION
HRR AC1 ,FILSTA(REG) ;BINARY-MODE?
TRNN AC1 ,FILBIN ;SKIP IF YES
IMULI AC0 ,5 ;CALCULATE BYTE-COUNT
MOVEM AC0 ,FILBTC(REG) ;STORE INTO BUFFER-HEADER
SETOM TMPFLG ;SHOW TEMPCORE-READ
JRST FIXBUF ;CONTINUE IN MAIN STREAM
TMPSW: PJOB REG1 , ;GET JOBNAME
MOVEI AC0 ,3 ;LENGTH IN DECIMAL
MOVE REG3 ,FILNAM(REG) ;GET FILENAME
TMPLP: IDIVI REG1 ,12 ;CONVERT
ADDI REG2 ,"0"-40 ;JOBNAME
LSHC REG2 ,-6 ;TO
SOJG AC0 ,TMPLP ;SIXBITIZED DECIMAL
MOVEM REG3 ,FILNAME(REG) ;NEW FILENAME IS NNNXXX.YYY
JRST TMPRET ;RETRY FROM DISK
;
;*** PROCEDURE REOPEN
; - CLOSE A FILE
; - OPEN SAME OR NEW FILE
; - <REG>=FILE-BLOCK
; - <REG1>=FILENAME
; - REG2=PROTECTION-CODE
; - REG3=PROJ.-PROGR.-NR.
; - <REG4>=DEVICE
;
REOPEN: HRRZ REG6 ,FILBFH(REG) ;GET ADDRESS OF NEXT BUFFER IN RING
SETZM TMPFLG ;NO TEMPCORE-FILE
SKIPE REG4 ;NEW DEVICE
SETZM REG6 ;YES - FORCE GETTING NEW
;BUFFERS AFTER OPEN
PUSHJ TOPP ,CLSFIL ;CLOSE
MOVEM AC0 ,FILSTA+2(REG) ;INSERT APPROPRIATE BF-HEADER ADDRESS
LSH REG2 ,33 ;SHIFT LEFT PROT 27 BITS
MOVEM REG2 ,FILPROT(REG) ;INSERT PROTECTION CODE
HLLZS AC1 ,FILEXT(REG) ;TO GET CORRECT CRE-DATE
JUMPE REG1 ,OPN ;RETAIN PREVIOUS FILENAME
;AS DEFAULT IF NO ADDRESS IS SPECIFIED
MOVEM REG3 ,FILPPN(REG) ;PROJECT-PROGR. NUMBER
HRRI AC1 ,FILNAM(REG) ;WHERE TO DEPOSIT IT
MOVEI REG5 ,11 ;BYTE COUNT
PUSHJ TOPP ,ASTOSX ;CONVERT FILENAME TO SIXBIT
JUMPE REG4 ,OPN ;NEW DEVICE ?
MOVEI REG1 ,(REG4) ;YES - GET ADDRESS OF DEVICE NAME
MOVEI AC1 ,FILSTA+1(REG) ;AND WHERE TO PUT SIXBIT NAME
MOVEI REG5 ,6 ;BYTE COUNT
PUSHJ TOPP ,ASTOSX ;CONVERT TO SIXBIT
OPN: SETZM FILEOF(REG) ;CLEAR EOF - MARKER
SETZM FILEOL(REG) ;CLEAR EOL - MARKER
AOS FILEOL(REG) ;SET EOL TO FORCE TEST FOR LINENR.
SETZM FILCMP(REG) ;CLEARS COMPONENT
MOVE AC0 ,[ASCII/-----/] ;INITIALIZE LINE-NUMBER
MOVEM AC0 ,FILLNR(REG)
HLR AC0 ,FILPTR(REG) ;FILE-FORM?
TRNN AC0 ,FILDAT ;SKIP IF BINARY
HRRZS FILCNT(REG) ;CLEAR CHARACTERCOUNT IF ASCII
PUSHJ TOPP ,TMPTST ;IS IT A TEMP-FILE?
JRST TEMPCR ;YES, OPEN TEMPCORE-FILE
TMPRET: XCT FILOPN(REG) ;OPEN
JRST SETEOF ;ERROR ON OPEN
FIXBUF: JUMPE REG6 ,REOPRT ;BUFFER RING ESTABLISHED ?
TLO REG6 ,400000 ;YES - RESET RING USE BIT
MOVEM REG6 ,FILBFH(REG) ;
HRLZI AC0 ,400000 ;MASK TO CLEAR BUFFER USE BIT
ANDCAM AC0 ,(REG6)
HRR REG6 ,(REG6) ;ADDRESS OF NEXT BUFFER IN RING
CAME REG6 ,FILBFH(REG) ;ONCE AROUND ?
JRST .-3 ;NOT YET
REOPRT: POPJ TOPP , ;OK - RETURN
TMPER1: OUTSTR [ASCIZ/
%? NOT ENOUGH CORE TO READ TEMPCORE-FILE /]
PUSHJ TOPP ,WRTFNM
JRST WRTPC
;
;*** LITERALS
;
LIT
PRGEND
TITLE REASTR *** PROCEDURES READS AND READPS ***
TWOSEG
;
;*** ENTRY-POINTS ***
;
ENTRY READS
ENTRY READPS
;
;*** EXTERNAL REFERENCES ***
;
EXTERN CONERR
EXTERN GETCH
;
;*** REGISTER DEFINITION ***
;
AC0= 0
AC1= 1
REGIN= 1 ;INITILISATION OF REGISTERSTACK
REG= REGIN+1
REG1= REGIN+1+1
REG2= REGIN+1+2
REG3= REGIN+1+3
REG4= REGIN+1+4
REG5= REGIN+1+5
REG6= REGIN+1+6
NEWREG= 15
TOPP= 17
;
;*** DESCRIPTION OF PASCAL-FILEBLOCK (SEE PROCEDURE WRITEMC OF COMPILER) ***
;
FILPTR= 0
FILEOF= 1
FILEOL= 2
FILOPN= 3
FILLKP= 4
FILENT= 5
FILIN= 6
FILOUT= 7
FILCLS= 10
FILSTA= 11 ;.+0 FOR FILESTATUS
;.+1 FOR DEVICE
;.+2 FOR POINTER TO BUFFERHEADER
FILNAM= 14
FILEXT= 15
FILPRO= 16
FILPPN= 17
FILBFH= 20 ;BUFFER HEADER
FILBTP= 21 ;BYTE POINTER
FILBTC= 22 ;BYTE COUNT IN BUFFER
FILLNR= 23 ;IF ASCII MODE - LINENR IN ASCIICHARA
;CTERS
FILCNT= 24 ;LH= IF BINARY MODE : NEGATIVE NUMBE
;R OF WORDS IN COMPONENT
;IF ASCII MODE : CHARACTERCNT IN LIN
;E AND TAB INDICATOR
;RH= ADDRESS OF FIRST WORD IN COMPONE
;NT
FILCMP= 25 ;FIRST WORD OF COMPONENT
;
;*** START OF INVARIANT CODE ***
;
RELOC 400000
;
;*** PROCEDURE READS/READPS
; - READ STRING/PACKED STRING
; - <REG>=FILE-BLOCK
; - <REG1>=STRING
; - REG2=LENGTH
;
READS: MOVE REG3 ,[POINT 36,(REG1),-1] ;BYTE-PTR FOR FULLWORD
SKIPA
READPS: MOVE REG3 ,[POINT 7,(REG1),-1] ;BYTE-PTR FOR PACKED-ASCII
SKIPBL: MOVE AC0 ,FILCMP(REG) ;FETCH COMP.
CAIE AC0 ," " ;BLANK?
JRST NONBLK ;NO
PUSHJ TOPP ,GETCH ;SKIP BLANK
JRST SKIPBL ;LOOP AROUND
NONBLK: CAIE AC0 ,"'" ;HYPHON?
JRST CONERR ;HMM...
PUSHJ TOPP ,GETCH ;SKIP IT
MOVEI REG4 ," " ;PREV. CHAR NON-HYPHON
SKIPA
READLP: PUSHJ TOPP ,GETCH ;GET NEXT
MOVE AC0 ,FILCMP(REG) ;FETCH 1ST BYTE OF STRG
CAIN AC0 ,"'" ;HYPHON?
JRST HYPHON ;YES
CAIN REG4 ,"'" ;PREV. CHAR HYPHON?
JRST CONERR ;YES-MUST NOT HAPPEN
JRST DEPSIT ;NO-DEPOSIT CHAR
HYPHON: CAIN REG4 ,"'" ;PREV. CHAR HYPHON?
JRST DEPSIT ;YES-DEPOSIT HYPH.
MOVE REG4 ,AC0 ;SAVE HYPHON
JRST READLP ;LOOP AROUND
DEPSIT: IDPB AC0 ,REG3 ;DEPOSIT BYTE
MOVEI REG4 ," " ;PREV. CHAR NON-HYPHON
SOJG REG2 ,READLP ;LOOP AROUND
PUSHJ TOPP ,GETCH
MOVE AC0 ,FILCMP(REG) ;FETCH LAST BYTE
CAIE AC0 ,"'" ;IS IT A HYPHON?
JRST CONERR ;SORRY...
PUSHJ TOPP ,GETCH ;POSITION FILE
POPJ TOPP , ;AND RETURN TO USER
;
;*** LITERALS
;
LIT
PRGEND
TITLE CLOSE *** PROCEDURE CLSFIL ***
TWOSEG
;
;*** ENTRY-POINTS ***
;
ENTRY CLSFIL
;
;*** EXTERNAL-REFERENCES ***
;
EXTERN TMPCR1
EXTERN TMPTST
;
;*** REGISTER DEFINITION ***
;
AC0= 0
AC1= 1
REGIN= 1 ;INITILISATION OF REGISTERSTACK
REG= REGIN+1
REG1= REGIN+1+1
REG2= REGIN+1+2
REG3= REGIN+1+3
REG4= REGIN+1+4
REG5= REGIN+1+5
REG6= REGIN+1+6
NEWREG= 15
TOPP= 17
;
;*** DESCRIPTION OF PASCAL-FILEBLOCK (SEE PROCEDURE WRITEMC OF COMPILER) ***
;
FILPTR= 0
FILEOF= 1
FILEOL= 2
FILOPN= 3
FILLKP= 4
FILENT= 5
FILIN= 6
FILOUT= 7
FILCLS= 10
FILSTA= 11 ;.+0 FOR FILESTATUS
;.+1 FOR DEVICE
;.+2 FOR POINTER TO BUFFERHEADER
FILNAM= 14
FILEXT= 15
FILPRO= 16
FILPPN= 17
FILBFH= 20 ;BUFFER HEADER
FILBTP= 21 ;BYTE POINTER
FILBTC= 22 ;BYTE COUNT IN BUFFER
FILLNR= 23 ;IF ASCII MODE - LINENR IN ASCIICHARA
;CTERS
FILCNT= 24 ;LH= IF BINARY MODE : NEGATIVE NUMBE
;R OF WORDS IN COMPONENT
;IF ASCII MODE : CHARACTERCNT IN LIN
;E AND TAB INDICATOR
;RH= ADDRESS OF FIRST WORD IN COMPONE
;NT
FILCMP= 25 ;FIRST WORD OF COMPONENT
;
;*** START OF INVARIANT CODE
;
RELOC 400000
;
;*** PROCEDURE CLSFIL
; - CLOSE OPENED FILE
; - ISSUE TEMPCORE-UUO ON TEMP-FILES
; - <REG>=FILE-BLOCK
;
CLSFIL: SKIPN AC1, FILSTA+2(REG) ;NEVER OPENED?
POPJ TOPP, ;YES - NOTHING TO CLOSE
TLNN AC1, 777777 ;OPEN FOR OUTPUT?
JRST CLSIN ;NO - CLOSE IT
PUSHJ TOPP, TMPCR1 ;ISSUE TEMPCORE-UUO
;IF TEMP-FILE
PUSHJ TOPP, TMPTST ;WAS IT TEMP-FILE?
POPJ TOPP, ;YES - NOTHING TO CLOSE
CLSIN: XCT FILCLS(REG) ;CLOSE FILE
POPJ TOPP, ;RETURN TO CALLER
;
;*** LITERALS
;
LIT
PRGEND
TITLE PUT *** PROCEDURES PUT, PUTCH, PUTLN, PUTPG AND TMPCRW ***
TWOSEG
;
;*** ENTRY-POINTS ***
;
ENTRY PUT
ENTRY TMPCRW
ENTRY TMPCR1
ENTRY PUTCH
ENTRY PUTBUF
ENTRY PUTLN
ENTRY PUTPG
;
;*** EXTERNAL-REFERENCES ***
;
EXTERN PUTERR
EXTERN TMPBLK
EXTERN SETEOF
EXTERN TMPTST
EXTERN WRTPC
EXTERN WRTFNM
;
;*** REGISTER DEFINITION ***
;
AC0= 0
AC1= 1
REGIN= 1 ;INITILISATION OF REGISTERSTACK
REG= REGIN+1
REG1= REGIN+1+1
REG2= REGIN+1+2
REG3= REGIN+1+3
REG4= REGIN+1+4
REG5= REGIN+1+5
REG6= REGIN+1+6
NEWREG= 15
TOPP= 17
;
;*** DESCRIPTION OF PASCAL-FILEBLOCK (SEE PROCEDURE WRITEMC OF COMPILER) ***
;
FILDAT= 1 ;FLAG TO TEST FOR TEXT-FILE
FILBIN= 17 ;FLAGS TO TEST FOR ASCII-MODE
FILPTR= 0
FILEOF= 1
FILEOL= 2
FILOPN= 3
FILLKP= 4
FILENT= 5
FILIN= 6
FILOUT= 7
FILCLS= 10
FILSTA= 11 ;.+0 FOR FILESTATUS
;.+1 FOR DEVICE
;.+2 FOR POINTER TO BUFFERHEADER
FILNAM= 14
FILEXT= 15
FILPRO= 16
FILPPN= 17
FILBFH= 20 ;BUFFER HEADER
FILBTP= 21 ;BYTE POINTER
FILBTC= 22 ;BYTE COUNT IN BUFFER
FILLNR= 23 ;IF ASCII MODE - LINENR IN ASCIICHARA
;CTERS
FILCNT= 24 ;LH= IF BINARY MODE : NEGATIVE NUMBE
;R OF WORDS IN COMPONENT
;IF ASCII MODE : CHARACTERCNT IN LIN
;E AND TAB INDICATOR
;RH= ADDRESS OF FIRST WORD IN COMPONE
;NT
FILCMP= 25 ;FIRST WORD OF COMPONENT
;
;*** CONSTANTS ***
;
TMPSIZ= 200
;
;*** START OF VARIANT CODE
;
CLSFLG: XWD 0,0
RENBLK: XWD 0,0
XWD 0,0
XWD 0,0
XWD 0,0
RENUUO: XWD 0,RENBLK
;
;*** START OF INVARIANT CODE
;
RELOC 400000
;
;*** PROCEDURE PUTCH
; - PUT ONE CHAR
; - <REG>=FILE-BLOCK
; - AC0=CHAR
;
PUTCH: SKIPG FILEOF(REG) ;EOF?
JRST PUTNEOF ;NO
PTCTEST:SOSGE FILBTC(REG) ;SPACE LEFT IN BUFFER?
JRST [
PUSHJ TOPP ,PUTBF1 ;PUT CURRENT BUFFER
JRST PTCTEST] ;RET TO CALLER
CAIN AC0 ,"←"
MOVEI AC0 ,30 ;Ko: convert to Stanford underbar
IDPB AC0 ,FILBTP(REG) ;DEPOSIT CHARACTER IN OUTPUT BUFFER
POPJ TOPP , ;RETURN
;
;*** PROCEDURE PUT
; - PUT FILE-COMPONENT
; - <REG>=FILE-BLOCK
;
PUT: SKIPG FILEOF(REG) ;EOF ?
JRST PUTNEOF ;NO
MOVE AC1 ,FILCNT(REG) ;GET TRANSFER COUNT
;FOR FILE COMPONENT
hlrz ac0 ,filptr(reg) ;text-file? (*EJG 23OCT78*)
trnn ac0 ,fildat ;skip if no (*EJG 23OCT78*)
jrst putesx ;jump if yes (*EJG 23OCT78*)
PUTEST: SOSGE FILBTC(REG) ;SPACE LEFT IN BUFFER ?
JRST [
PUSHJ TOPP ,PUTBF1 ;PUT CURRENT BUFFER
JRST PUTEST] ;RET TO CALLER
MOVE AC0 ,(AC1) ;GET NEXT WORD OF COMPONENT
IDPB AC0 ,FILBTP(REG) ;DEPOSIT IN OUTPUT BUFFER
AOBJN AC1 ,PUTEST ;MORE WORDS IN COMPONENT ?
POPJ TOPP , ;NO
; Use loop "putesx" only for text-files: Stanford ASCII translation (*EJG 23OCT78*)
putesx: SOSGE FILBTC(REG) ;SPACE LEFT IN BUFFER ?
JRST [
PUSHJ TOPP ,PUTBF1 ;PUT CURRENT BUFFER
JRST putesx] ;RET TO CALLER
MOVE AC0 ,(AC1) ;GET NEXT WORD OF COMPONENT
CAIN AC0 ,"←"
MOVEI AC0 ,30 ;Ko: convert to Stanford underbar
IDPB AC0 ,FILBTP(REG) ;DEPOSIT IN OUTPUT BUFFER
AOBJN AC1 ,putesx ;MORE WORDS IN COMPONENT ?
POPJ TOPP , ;NO
;
;*** PROCEDURE PUTBUF
; - PUT CURRENT BLOCK
; DISK-BLOCKS ARE ALWAYS FILLED UP
; WITH ZEROS TO 128 WORDS, EXCEPT OF
; THE LAST ONE WRITTEN BY CLOSE
; - <REG>=FILE-BLOCK
;
PUTBUF: PUSHJ TOPP ,PUTBF1
POPJ TOPP ,
PUTBF1: PUSHJ TOPP ,TMPCRW ;WRITE TEMP-FILE
XCT FILOUT(REG) ;PUT BUFFER
POPJ TOPP , ;OK-RETURN TO CALLER
JRST PUTERR ;I/O-ERROR
PUTNEOF:OUTSTR [ASCIZ/
%? REWRITE FOR FILE /]
PUSHJ TOPP ,WRTFNM
OUTSTR [ASCIZ/ REQUIRED/]
JRST WRTPC
;
;*** PROCEDURE PUTLN
; - WRITE <CR><LF>
; - <REG>=FILE-BLOCK
;
PUTLN: MOVEI AC0 ,15 ;<CR>
PUSHJ TOPP ,PUTCH
MOVEI AC0 ,12 ;<LF>
PUSHJ TOPP ,PUTCH
POPJ TOPP ,
;
;*** PROCEDURE PUTPG
; - WRITE <CR><FF>
; - <REG>=FILE-BLOCK
;
PUTPG: MOVEI AC0 ,15 ;<CR>
PUSHJ TOPP ,PUTCH ;
MOVEI AC0 ,14 ;<FF>
PUSHJ TOPP ,PUTCH
POPJ TOPP ,
;
;*** PROCEDURE TMPCRW
; - ISSUE TMPCOR-UUO ON CURRENT BUFFER
; - RETURN TO CALLER IF UUO FAILS
; - SET EOF TO PREVENT WRITING OF
; MORE THAN 1 BUFFER IF OK
; - <REG>=FILE-BLOCK
;
TMPCR1: SETOM CLSFLG ;COMING FROM CLSFIL OR REOPEN
SKIPA
TMPCRW: SETZM CLSFLG ;COMING FROM PUTBUFFER
PUSH TOPP ,AC0
PUSH TOPP ,AC1
PUSH TOPP ,REG1
HLLZ AC1 ,FILEXT(REG)
CAME AC1 ,[SIXBIT/TMP /]
JRST LEAVE
HLLZ AC1 ,FILNAM(REG)
CAMLE AC1 ,[SIXBIT/999 /]
JRST LEAVE
HRLZ AC0 ,FILNAM(REG)
MOVEM AC0 ,TMPBLK ;PTR TO CONT.-BLOCK
MOVE AC0 ,FILBTC(REG) ;BUFFER'S BYTE-COUNT
HRR AC1 ,FILSTA(REG) ;BINARY-MODE?
TRNN AC1 ,FILBIN ;SKIP IF YES?
PUSHJ TOPP ,ASCFI ;CORRECT BYTE-COUNT
SUBI AC0 ,TMPSIZ ;GET NEG NUM OF CHARS
HRLM AC0 ,TMPBLK+1 ;TO CONT.-BLOCK
HRR AC0 ,FILBFH(REG) ;GET BUFFER'S ADDR
ADDI AC0 ,1 ;POINT TO 1ST CHAR
HRRM AC0 ,TMPBLK+1 ;TO CONT.-BLOCK
MOVE AC0 ,[XWD 3,TMPBLK] ;DO TEMPCORE
TMPCOR AC0 , ;WRITE
JRST LEAVE
HRLZI AC0 ,400000 ;KILL
IORM AC0 ,FILBFH(REG) ;BUFFER-RING
XCT FILCLS(REG) ;CLOSE DISK FILE
HLL AC1, FILENT(REG) ;SET
TLZ AC1, 22000 ;UP
HLLM AC1, RENUUO ;RENAME-UUO
XCT RENUUO ;AND DELETE DISK FILE
SKIP
MOVE AC1, FILNAM(REG) ;RESTORE
HRLZM AC1, FILNAM(REG) ;FILENAME
SKIPE CLSFLG
JRST LEAVE
POP TOPP ,REG1 ;RESTORE REG1
POP TOPP ,AC1 ;RESTORE AC1
POP TOPP ,AC0 ;RESTORE AC0
POP TOPP ,
POP TOPP ,
JRST SETEOF
LEAVE: POP TOPP ,REG1 ;RESTORE REG1
POP TOPP ,AC1
POP TOPP ,AC0
POPJ TOPP ,
ASCFI: IDIVI AC0 ,5
CAIG AC1 ,0
POPJ TOPP ,
MOVEI REG1 ," "
IDPB REG1 ,FILBTP(REG)
SOJG AC1 ,.-1
POPJ TOPP ,
;
;*** LITERALS
;
LIT
PRGEND
TITLE GET *** PROCEDURES GET, GETCH AND GETLN ***
TWOSEG
;
;*** ENTRY-POINTS ***
;
ENTRY GET
ENTRY GETBUF
ENTRY GETCH
ENTRY GETLN
;
;*** EXTERNAL REFERENCES ***
;
EXTERN TMPTST
EXTERN SETEOF
EXTERN WRTPC
EXTERN WRTFNM
;
;*** REGISTER DEFINITION ***
;
AC0= 0
AC1= 1
REGIN= 1 ;INITILISATION OF REGISTERSTACK
REG= REGIN+1
REG1= REGIN+1+1
REG2= REGIN+1+2
REG3= REGIN+1+3
REG4= REGIN+1+4
REG5= REGIN+1+5
REG6= REGIN+1+6
NEWREG= 15
TOPP= 17
;
;*** DESCRIPTION OF PASCAL-FILEBLOCK (SEE PROCEDURE WRITEMC OF COMPILER) ***
;
FILPTR= 0
FILEOF= 1
FILEOL= 2
FILOPN= 3
FILLKP= 4
FILENT= 5
FILIN= 6
FILOUT= 7
FILCLS= 10
FILSTA= 11 ;.+0 FOR FILESTATUS
;.+1 FOR DEVICE
;.+2 FOR POINTER TO BUFFERHEADER
FILNAM= 14
FILEXT= 15
FILPRO= 16
FILPPN= 17
FILBFH= 20 ;BUFFER HEADER
FILBTP= 21 ;BYTE POINTER
FILBTC= 22 ;BYTE COUNT IN BUFFER
FILLNR= 23 ;IF ASCII MODE - LINENR IN ASCIICHARA
;CTERS
FILCNT= 24 ;LH= IF BINARY MODE : NEGATIVE NUMBE
;R OF WORDS IN COMPONENT
;IF ASCII MODE : CHARACTERCNT IN LIN
;E AND TAB INDICATOR
;RH= ADDRESS OF FIRST WORD IN COMPONE
;NT
FILCMP= 25 ;FIRST WORD OF COMPONENT
;
;*** START OF INVARIANT CODE
;
RELOC 400000
;
;*** PROCEDURE GETLN
; - READ 1ST CHAR OF NEXT LINE
; - TEST FOR LINE-NUMBER AND PAGE-MARK
; - <REG>=FILE-BLOCK
;
PUSHJ TOPP ,GETCH ;GETS NEXT CHARACTER IN LINE
GETLN: SKIPN FILEOL(REG) ;IS EOLN = TRUE
JRST GETLN-1 ;NO - CHARAKTER'S IN LINE
;WILL BE OVERREAD
MOVE AC0 ,[ASCIZ/-----/] ;ARR. SET THE LINE NUMBER
MOVEM AC0 ,FILLNR(REG) ;TO DASHES
PUSHJ TOPP ,GETCNT ;GET 1ST CHAR OF NEXT LINE
SKIPE FILEOF(REG) ;EOF?
JRST GETEOF ;YES
MOVEI AC0 ,1 ;TEST FOR LINENR OR PAGEMARK
TDNN AC0 ,@FILBTP(REG) ;LAST BIT EQUAL ZERO?
JRST GETRET ;YES - RETURN
MOVE AC1 ,@FILBTP(REG) ;NO - GET LINENUMBER OR PAGEMARK
TRZ AC1 ,1 ;BIT 35 TO ZERO
MOVEM AC1 ,FILLNR(REG) ;STORE IT TO FILLNR
MOVE AC0 ,FILBTC(REG)
SUBI AC0 ,5 ;TO OVERREAD LAST FOUR DIGITS AND TAB
JUMPGE AC0 ,GETNCP ;ALL THIS FIVE CHARACTERS IN THIS BUF
;FER?
PUSHJ TOPP ,GETBUF ;GET A NEW BUFFER
IBP FILBTP(REG) ;TO OVERREAD TAB OR FIRST CARRIGE RET
;URN
SOS FILBTC(REG)
JRST .+3
GETNCP: MOVEM AC0 ,FILBTC(REG) ;RESTORE BYTECOUNT
AOS FILBTP(REG) ;INCREMENTS BYTEPOINTER BY 5
;4 DIGITS AND TAB
HRRZS FILCNT(REG) ;SETS CHARACTERCOUNT TO ZERO
;
;*** PROCEDURE GETCH
; - READ ONE CHAR
; - <REG>=FILE-BLOCK
;
GETCH: SKIPE FILEOF(REG) ;EOF ?,(GETCH GETS ONE CHARACTER,TEXT
;FILES ONLY)
JRST GETEOF ;YES - TEST WETHER TOO MANY
;ATTEMPTS TO OVERREAD EOF
SKIPE FILEOL(REG) ;EOLN ?
JRST GETLN ;YES - LOOK FOR LINER
getcnt: skipn filsta+2(reg) ;file open?
jrst geterr ;no - pufffffff
MOVE AC1 ,FILCNT(REG) ;GET TRANSFER WORD FOR FILECOMPONENT
JUMPGE AC1 ,GTCTEST ;REMAINING BLANKS FREE?
AOBJP AC1 ,.+1 ;YES - INCREMENT CHARACTERCNT
;(WILL NEVER JUMP)
TLNN AC1 ,7 ;CHARACTERCNT IS ZERO MODE 7
TLZ AC1 ,400000 ;YES - CLEAR TAB INDICATOR
JRST GETRET
PUSHJ TOPP ,GETBUF ;GET NEXT BUFFER
GTCTEST:SOSGE FILBTC(REG) ;ANY BYTE LEFT IN BUFFER ?
JRST GTCTEST-1 ;NO - GO FOR NEXT BUFFER
ILDB AC0 ,FILBTP(REG) ;GET NEXT BYTE
MOVEM AC0 ,(AC1) ;DEPOSIT IT IN FILE COMPONENT
AOBJN AC1 ,GTCTEST ;NEVER JUMPS
SETZM FILEOL(REG) ;RESETS FILEOL IN ASCII-FILE
CAILE AC0 ,137 ;CHECK FOR LEGAL PASCAL-CHARACTER
JRST GETCON ;CORRECT LOWER TO UPPER CASE
CAIL AC0 ," " ;BELOW BLANK ?
JRST GETRET ;NO-VALID PASCAL CHAR
CAIN AC0 ,14 ;ARR. FORM FEED?
JRST GETFF ;MARK IT IN LINENR
CAIN AC0 ,11 ;HORIZONTAL TAB
JRST GETTAB ;YES
CAIN AC0 ,12 ;LINE FEED?
JRST GETLF
CAIN AC0 ,30 ;the stupid Stanford underbar?
jrst getsbr ;yes - Stanford '←', or ascii underbar
jrst getcnt ;no - ignore this character. get the next
GETFF: MOVE AC1 ,[ASCIZ/ /] ;ARR. PUT BLANKS IN LINENR
MOVEM AC1 ,FILLNR(REG) ; and do same as line feed
GETLF: AOS FILEOL(REG) ;SET EOLN
SETZ AC1 , ;CLEARS CHARACTERCOUNT
JRST GETBLK ;DEPOSIT A BLANK
GETCON: SUBI AC0 ,40 ;CORR. CHAR
JRST GETNEW ;DEP. INTO FILCOMP
getsbr: movei ac0 ,"←" ;convert Stanford underbar to '←'
jrst getnew
GETTAB: TLNE AC1 ,7 ;IS THIS TAB ON
;CHARACTERCOUNT MODULO 8 = 0
TLO AC1 ,400000 ;NO -SETS TAB INDICATOR
GETBLK: MOVEI AC0 ," "
GETNEW: MOVEM AC0 ,FILCMP(REG)
GETRET: HLLM AC1 ,FILCNT(REG) ;SAVES NEW CHARACTERCNT AND TAB INDIC
;ATOR
POPJ TOPP ,
GETEOF: AOSGE FILEOF(REG) ;TOO MANY ATTEMPTS ?
POPJ TOPP , ;NO - RETURN
AOS FILEOF(REG) ;SET EOF TRUE
OUTSTR [ASCIZ/
%? INPUT ERROR: ATTEMPT TO READ BEYOND EOF OF /]
errout: PUSHJ TOPP ,WRTFNM ;WRITE FILE NAME
JRST WRTPC
geterr: outstr [asciz/
%? INPUT ERROR: RESET REQUIRED FOR /]
jrst errout
;
;*** PROCEDURE GET
; - READ NEXT FILE-COMPONENT
; - <REG>=FILE-BLOCK
;
GET: SKIPE FILEOF(REG) ;EOF?
JRST GETEOF ;YES-TEST WETHER TOO MANY ATTEMPTS TO
; OVERREAD EOF
MOVE AC1 ,FILCNT(REG) ;GET TRANSFER WORD FOR FILECOMPONENT
GETEST: SOSGE FILBTC(REG) ;ANY BYTE LEFT IN BUFFER?
JRST [
PUSHJ TOPP ,GETBUF ;GET NEXT BUFFER
JRST GETEST] ;RETURN TO CALLER
ILDB AC0 ,FILBTP(REG) ;GET NEXT BYTE
MOVEM AC0 ,(AC1) ;DEPOSIT IT IN FILECOMPONENT
AOBJN AC1 ,GETEST ;MORE BYTES IN THIS COMPONENT?
POPJ TOPP , ;NO ,RETURN
;
;*** PROCEDURE GETBUF
; - GET NEXT BUFFER
; - <REG>=FILE-BLOCK
;
GETBUF: PUSHJ TOPP ,TMPTST ;IS IT A TEMPFILE?
JRST BADIO ;YES-ONLY 1 BUFFER ALLOWED
XCT FILIN(REG) ;GET NEXT BUFFER
POPJ TOPP , ;OK-RETURN TO CALLER
BADIO: POP TOPP , ;FORGET LAST LINK
JRST SETEOF ;SET EOF IF ERROR
;
;*** LITERALS ***
;
LIT
PRGEND
TITLE DATE *** PROCEDURE DATE ***
opdef dateuu [date]
TWOSEG
;
;*** ENTRY-POINTS ***
;
ENTRY DATE.
ENTRY DATE
;
;*** EXTERNAL REFERENCES ***
;
;
;*** REGISTER DEFINITION ***
;
AC0= 0
AC1= 1
REGIN= 1 ;INITILISATION OF REGISTERSTACK
REG= REGIN+1
REG1= REGIN+1+1
REG2= REGIN+1+2
REG3= REGIN+1+3
REG4= REGIN+1+4
REG5= REGIN+1+5
REG6= REGIN+1+6
NEWREG= 15
TOPP= 17
;
;*** START OF INVARIANT CODE ***
;
RELOC 400000
;
;*** PROCEDURE DATE
; - STORE STANDARD ASCII-DATE
; DD-MMM-YY INTO LOCATION <REG>
; - <REG>=ASCII/10 CHAR. DATE/
;
GETINF:;GETTAB AC0 , ;GET VALUE FROM SYSTEM-TABLE
; POPJ TOPP ,
IDIVI AC0 ,144
HRRZ AC0 ,AC1
IDIVI AC0 ,12 ;DIV BY 10
ADDI AC0 ,60 ;GET TWO
ADDI AC1 ,60 ;ASCII NUMBERS
IDPB AC0 ,REG1 ;DEPOSIT 1ST
IDPB AC1 ,REG1 ;DEPOSIT 2ND
POPJ TOPP , ;RETURN TO CALLER
DATE:
DATE.: PUSH TOPP ,REG1 ;SAVE
PUSH TOPP ,REG2 ;THREE
PUSH TOPP ,REG3 ;REGS
MOVE REG1 ,[POINT 7,(REG),-1] ;BTP FOR DATE-STRING
; MOVE AC0 ,[XWD 60,11] ;GET DAY
dateuu reg2,
idivi reg2,↑D31
movei ac0,1(reg3)
PUSHJ TOPP ,GETINF
HRRZI AC0 ,"-" ;DEPOSIT "-"
IDPB AC0 ,REG1
; MOVE AC1 ,[XWD 57,11] ;GET MONTH
; GETTAB AC1 ,
; JRST END ;MERDE
; MOVE REG2 ,[POINT 7,MONTHS-1(AC1),-1] ;BTP FOR MONTH-ABBREV.
idivi reg2,↑D12
movei ac1,↑D1964(reg2)
movei reg2,months(reg3)
hrli reg2,440700
HRRZI REG3 ,3 ;COUNTER
LOOP: ILDB AC0 ,REG2 ;GET CHAR
IDPB AC0 ,REG1 ;DEPOSIT IN STRING
SOJG REG3 ,LOOP ;DO IT THREE TIMES
HRRZI AC0 ,"-" ;ANOTHER "-"
IDPB AC0 ,REG1
; MOVE AC0 ,[XWD 56,11] ;GET YEAR
move ac0,ac1
PUSHJ TOPP ,GETINF
HRRZI AC0 ," "
IDPB AC0 ,REG1
END: POP TOPP ,REG3 ;RESTORE
POP TOPP ,REG2 ;SAVED
POP TOPP ,REG1 ;REGS
POPJ TOPP , ;RET TO CALLER
MONTHS: ASCIZ/JAN FEB MAR APR MAY JUN JUL AUG SEP OCT NOV DEC /
;
;*** LITERALS ***
;
LIT
PRGEND
TITLE TIME *** PROCEDURE TIME ***
TWOSEG
;
;*** ENTRY-POINTS ***
;
ENTRY TIME.
ENTRY TIME
;
;*** EXTERNAL REFERENCES ***
;
;
;*** REGISTER DEFINITION ***
;
AC0= 0
AC1= 1
REGIN= 1 ;INITILISATION OF REGISTERSTACK
REG= REGIN+1
REG1= REGIN+1+1
REG2= REGIN+1+2
REG3= REGIN+1+3
REG4= REGIN+1+4
REG5= REGIN+1+5
REG6= REGIN+1+6
NEWREG= 15
TOPP= 17
;
;*** START OF INVARIANT CODE ***
;
RELOC 400000
;
;*** PROCEDURE TIME
; - STORE STANDARD ASCII-TIME
; HH:MM:SS INTO LOCATION <REG>
; - <REG>=ASCII/10 CHAR. TIME/
;
GETINF:;GETTAB AC0 , ;GET VALUE FROM SYSTEM-TABLE
; POPJ TOPP ,
IDIVI AC0 ,12 ;DIV BY 10
ADDI AC0 ,60 ;GET TWO
ADDI AC1 ,60 ;ASCII NUMBERS
IDPB AC0 ,REG1 ;DEPOSIT 1ST
IDPB AC1 ,REG1 ;DEPOSIT 2ND
POPJ TOPP , ;RETURN TO CALLER
TIME:
TIME.: PUSH TOPP ,REG1 ;SAVE REG1
MOVE REG1 ,[POINT 7,(REG),-1] ;BTP FOR TIME-STRING
timer ac0,
idivi ac0,↑D60
idivi ac0,↑D60
push topp,ac1 ;push seconds
idivi ac0,↑D60
push topp,ac1 ;push minutes
; MOVE AC0 ,[XWD 61,11] ;GET HOURS
PUSHJ TOPP ,GETINF
HRRZI AC0 ,":" ;DEPOSIT ":"
IDPB AC0 ,REG1
pop topp,ac0
; MOVE AC0 ,[XWD 62,11] ;GET MINUTES
PUSHJ TOPP ,GETINF
HRRZI AC0 ,":" ;ANOTHER ":"
IDPB AC0 ,REG1
pop topp,ac0
; MOVE AC0 ,[XWD 63,11] ;GET SECONDS
PUSHJ TOPP ,GETINF
HRRZI AC0 ," "
IDPB AC0 ,REG1
HRRZI AC0 ," "
IDPB AC0 ,REG1
END: POP TOPP ,REG1 ;RESTORE REG1
POPJ TOPP , ;RETURN TO CALLER
;
;*** LITERALS ***
;
LIT
PRGEND
TITLE EXIT *** PROCEDURES WRTPC AND OTHER EXITS ***
TWOSEG
;
;*** ENTRY-POINTS ***
;
ENTRY WRTPC
ENTRY CORERR
ENTRY OVERF.
ENTRY INXERR
ENTRY SRERR
ENTRY CONERR
ENTRY PUTERR
ENTRY END
ENTRY STOP
ENTRY IPTERR
ENTRY SETERR
ENTRY NOCORE
ENTRY PTRERR
;
;*** EXTERNAL REFERENCES ***
;
EXTERN WRTFNM
;
;*** REGISTER DEFINITION ***
;
AC0= 0
AC1= 1
REGIN= 1 ;INITILISATION OF REGISTERSTACK
REG= REGIN+1
REG1= REGIN+1+1
REG2= REGIN+1+2
REG3= REGIN+1+3
REG4= REGIN+1+4
REG5= REGIN+1+5
REG6= REGIN+1+6
NEWREG= 15
BASIS= 16
TOPP= 17
;
;*** ADDRESSES ***
;
.JBDDT= 74
.JBTPC= 127
;
;*** START OF INVARIANT CODE ***
;
RELOC 400000
;
;*** PROCEDURE WRTPC
; - WRITE USER'S PC AND JUMP
; INTO PASDDT IF LOADED
;
WRTPC: OUTSTR [ASCIZ/ AT USER PC /]
HRRZ REG ,(BASIS) ;IF RH = LH = 0 THEN WE
HLRZ AC1 ,(BASIS) ;ARE ON MAIN-PROGRAM LEVEL
CAIN REG ,(AC1) ;IS IT MAIN?
JRST MAIN ;YES
HRRZ REG ,-1(REG) ;GET STARTADD. OF THIS PROCEDURE
SEARCH: HLRZ AC1 ,(REG) ;SEARCH THE INSTRUCTION
CAIE AC1 ,541757 ;HRRI 17,X(17) WHERE X-1 IS THE
AOJG REG ,SEARCH ;LENGTH OF THE ACTIVATION-RECORD
HRRZ AC1 ,(REG) ;THIS IS THE FIRST JUMP
GETADR: ADDI AC1 ,1(BASIS) ;INTO THE RUNTIME-SUPPORT
HRRZ REG ,(AC1) ;RETURN-ADDR IN REG FOR PASDDT
SOJ REG , ;ALWAYS MINUS ONE
HRRZI REG2 ,6
MOVE REG3 ,[POINT 3,REG,17]
ILDB AC1 ,REG3
ADDI AC1 ,60
OUTCHR AC1 ;WRITE PC
SOJG REG2 ,.-3
MOVEI AC1 ,15
OUTCHR AC1
MOVEI AC1 ,12
OUTCHR AC1
HRR AC1 ,.JBDDT ;LOAD PASDDT-ADDR
JUMPE AC1 ,END ;EXIT
JRST 0 ,-1(AC1) ;GOTO 'ERRDB.'
END: EXIT ;EXIT TO MONITOR
MAIN: HRRZ REG ,400000 ;START ADDR OF PROGRAM
HRRZ AC1 ,3(REG) ;WORDS OF STACK USED BY MAIN
JRST GETADR ;CONTINUE TO CALC. USER PC
CORERR: OUTSTR [ASCIZ/
%? STACK OVERRUNS HEAP: RETRY WITH MORE CORE/]
HRRZ REG ,(BASIS) ;TEST IF ERROR IN
HLRZ AC1 ,(BASIS) ;INITIALIZATION
CAIN REG ,(AC1) ;OF PROGRAM
JRST END
STOP: MOVEI TOPP ,-1(BASIS) ;RESET TOPP
HLR BASIS ,-1(BASIS) ;AND BASIS
JRST WRTPC
CONERR: OUTSTR [ASCIZ/
%? INPUT DATA ERROR IN FILE /]
PUSHJ TOPP ,WRTFNM
JRST WRTPC
INXERR: OUTSTR [ASCIZ/
%? ARRAY INDEX OUT OF BOUNDS/]
JRST WRTPC
SRERR: OUTSTR [ASCIZ/
%? SCALAR OUT OF RANGE/]
JRST WRTPC
PUTERR: OUTSTR [ASCIZ/
%? OUTPUT ERROR: DISK SPACE EXHAUSTED FOR FILE /]
PUSHJ TOPP ,WRTFNM ;WRITE FILE NAME
JRST WRTPC
OVERF.: OUTSTR [ASCIZ/
%? ARITHMETIC OVERFLOW OR ZERODIVIDE AT USER PC /]
HRRZ REG, .JBTPC
JRST GETADR+2
IPTERR: OUTSTR [ASCIZ/
%? SCALAR OUT OF RANGE IN FILE /]
PUSHJ TOPP ,WRTFNM
JRST WRTPC
SETERR: OUTSTR [ASCIZ/
%? MORE THAN 72 SET ELEMENTS/]
JRST WRTPC
NOCORE: OUTSTR [ASCIZ/
%? CORE REQUIREMENT GREATER THAN "CORMAX"/]
JRST WRTPC
PTRERR: OUTSTR [ASCIZ/
%? UNINITIALIZED OR NIL POINTER/] ;ARR
JRST WRTPC
;
;*** LITERALS ***
;
LIT
PRGEND
TITLE DEBSP *** DEBUG SUPPORT ***
TWOSEG
;
;*** ENTRY-POINTS
;
ENTRY INDEB.
ENTRY EXDEB.
;
;*** EXTERNAL REFERENCES
;
EXTERN END,DEBUG
EXTERN OVERF.
;REGISTER DEFINITION
AC0=0
AC1=1
REGIN=1 ;INITILISATION OF REGISTERSTACK
REG= REGIN+1
REG1=REGIN+1+1
REG2=REGIN+1+2
REG3=REGIN+1+3
REG4=REGIN+1+4
REG5=REGIN+1+5
REG6=REGIN+1+6
JBFFLW=14
NEWREG=15
BUFFER=15
BASIS=16
TOPP=17
;
;*** DESCRIPTION OF FILEBLOCK( SEE WRITEMC)
;
FILPTR= 0
FILEOF= 1
FILEOL= 2
FILOPN= 3
FILLKP= 4
FILENT= 5
FILIN= 6
FILOUT= 7
FILCLS=10
FILSTA=11 ; .+0 FOR FILESTATUS
; .+1 FOR DEVICE
; .+2 FOR POINTER TO BUFFERHEADER
FILNAM=14
FILEXT=15
FILPRO=16
FILPPN=17
FILBFH=20 ;BUFFER HEADER
FILBTP=21 ;BYTE POINTER
FILBTC=22 ;BYTE COUNT IN BUFFER
FILLNR=23 ;IF ASCII MODE - LINENR IN ASCIICHARACTERS
FILCNT=24 ;LH= IF BINARY MODE : NEG. NUMBER OF WORDS IN COMPONENT
; IF ASCII MODE : NR. OF CH. IN LINE AND TAB INDICATOR
;RH= ADDRESS OF FIRST WORD IN COMPONENT
FILCMP=25 ;FIRST WORD OF COMPONENT
;
;*** CONSTANTS
;
MAXEOF=10
DEBSIZE=2000 ;1K
;
;*** ADDRESSES
;
.JBREL= 44
.JBDDT= 74
.JBSA=120
.JBFF=121
.JBAPR=125
.JBCNI=126
.JBTPC=127
.JBOPC=130
RGSTRS=140
STACKBO=143
STATUS=144
LIMIT=145
.GTSGN=14
.GTLIM=40
;
;*** START OF VARIANT CODE
;
LOC .JBDDT ;UPDATE .JBDDT
XWD 0,DDTDB.
LOC .JBAPR ;UPDATE .JBAPR
XWD 0, APRINT ;INTERRUPT-ROUTINE
;
;*** START OF INVARIANT CODE
;
RELOC 400000
;
;*** PROCEDURE INDEB.
; - INITIALIZE DEBUG SYSTEM
;
INDEB.: JRST .+4 ;SKIP AROUND--KLUGE BY KUMAR
JUMPE AC1 ,.+3 ;NOT SHR
OUTSTR [ASCIZ/
%? PROGRAMS COMPILED WITH THE DEBUG-OPTION MUST NOT BE SHARABLE:
RETRY WITH .SAVE INSTEAD OF .SSAVE/]
JRST END
SOJ NEWREG , ;INCREMENT NEWREG
HRRI AC1 ,377777 ;LOAD FIRST LINK - WORD
HRLI AC1 ,377777 ;FOR HEAP - DUMP
MOVEM AC1 ,(NEWREG) ;DEPOSITE LINK - WORD
HRRZ AC1 ,.JBFF ;GET HIGHEST LOC
MOVEM AC1 ,RGSTRS ;OLD CORE-END BECOMES BEGIN OF DEBUG AREA
ADDI AC1 ,DEBSIZE
CORE AC1 , ;GET CORE FOR DEBUGGING
HALT ;ERROR RETURN
HRRZ AC1 ,RGSTRS
MOVEI AC1 ,DEBSIZE(AC1)
HRRM AC1 ,.JBFF
PUSHJ TOPP ,SAVERG ;SAVE REGISTERS
SETZM 0 ,STATUS ;LH='INIT', RH=PROG.BEGIN
PUSHJ TOPP ,INIAPR ;
PUSHJ TOPP ,DEBUG.
POPJ TOPP ,
;
;*** PROCEDURE EXDEB.
; - ENTER THE DEBUG SYSTEM
;
EXDEB.: PUSHJ TOPP ,SAVERG ;SAVE REGISTERS
HRLI AC1 ,1 ;STATUS='STOP'
HRR AC1 ,0(TOPP) ;RH=RETURNADDR
SUBI AC1 ,1 ;RH=STOPADDR
MOVEM AC1 ,STATUS
PUSHJ TOPP ,DEBUG. ;CALL DEBUG
POPJ TOPP ,
;
;*** AUXILIARY PROCEDURES OF THE DEBUG SYSTEM
;
HALT.: JRST 0 ,HALT1 ;THIS ENTRY MUST BE 2 LOC.
;BEFORE DDTDB.
ERRDB.: JRST 0 ,ERRDB1 ;THIS ENTRY MUST BE BEFORE DDTDB.
DDTDB.: PUSHJ TOPP ,SAVERG ;SAVE REGISTERS
HRLI AC1 ,2 ;STATUS='DDT'
HRR AC1 ,.JBOPC ;RETURNADDR
MOVEM AC1 ,STATUS
PUSHJ TOPP ,DEBUG. ;CALL DEBUG
JRST 0 ,@.JBOPC ;RETURN TO PROGRAM
;*******************************************************************************
HALT1: HRLI AC0 ,4 ;STATUS='HALT'
SKIPA
ERRDB1: HRLI AC0 ,3 ;STATUS='RUNTIME ERROR'
HRRZ AC1 ,TOPP
CAML AC1 ,RGSTRS ;ERROR IN DEBUG?
JRST END
MOVEM AC0 ,STATUS
PUSHJ TOPP ,SAVERG ;SAVE REGISTERS
PUSHJ TOPP ,DEBUG. ;CALL DEBUG
JRST 0 ,END ;EXIT
;*******************************************************************************
SAVERG: MOVEM AC0 ,@RGSTRS ;SAVE USER-REGISTERS
MOVE AC0 ,AC1
HRRZ AC1 ,RGSTRS
MOVEM AC0 ,1(AC1)
HRRI AC0 ,2(AC1)
HRLI AC0 ,2
BLT AC0 ,17(AC1)
POPJ TOPP ,0
;*******************************************************************************
INIAPR:;MOVE AC1 ,[XWD -1, .GTLIM] ;ARGUMENT FOR GETTAB
; GETTAB AC1 , ;
; HALT ;ERROR RETURN
; TLNN AC1 ,200 ;TEST IF BATCH-JOB
; JRST NOTBAT ;NO
; TLZ AC1 ,777740 ;SET BITS 0-12 TO ZERO
; IMULI AC1 ,24 ;CONVERT JIFFIES TO MSEC
; MOVEM AC1 ,LIMIT ;STORE TIME LIMIT
; MOVEI AC1 ,21110 ;ARGUMENT FOR APRENB
; APRENB AC1 , ;ILL-MEM-REF + CLOCK-FLAG
; POPJ TOPP ,
;*******************************************************************************
NOTBAT: MOVEI AC1 ,1 ;STORE,THAT THIS JOB IS
HRLM AC1 ,STACKBO ;A TIMESSHARING-JOB
MOVEI AC1 ,20110 ;ARGUMENT FOR APRENB
APRENB AC1 , ;ILL-MEM-REF
POPJ TOPP ,
;*******************************************************************************
APRINT: MOVEM AC0 ,@RGSTRS ;SAVE AC0
HRRZ AC0 ,.JBCNI ;GET REASON FOR INTERRUPT
TRNE AC0 ,1000 ;TEST IF TIME INTERRUPT
JRST TIMINT ;JUMP TO TIME-INTERRUPT-ROUTINE
TRNE AC0 ,110 ;TEST IF ARITHMETIC OVERFLOW
JRST OVERF. ;YES
MOVE AC0 ,.JBTPC ;MOVE PC IN AC0
OUTSTR [ASCIZ/
%? ILLEGAL MEMORY REFERENCE/]
JRST ERRDB1 ;AND JUMP TO ERRDEB1
;*******************************************************************************
TIMINT: SETZ AC0 ,
RUNTIM AC0 , ;GET RUNTIME
SUB AC0 ,LIMIT ;
JUMPGE AC0 ,TIMLIM ;IF THERE IS NOT ENOUGH TIME
MOVEI AC0 ,21000 ;ARGUMENT FOR APRENB
APRENB AC0 ,
MOVE AC0 ,@RGSTRS ;RESTORE AC0
JRSTF @.JBTPC ;JUMP BACK TO THE PROGRAM
;*******************************************************************************
TIMLIM: OUTSTR [ASCIZ/
%? TIME LIMIT EXCEEDED/]
MOVE AC0 ,.JBTPC ;PC TO AC0
JRST ERRDB1 ;JUMP TO ERRDEB1
;
;*** PROCEDURE DEBUG.
; - SAVE USER REGISTERS
; - PROVIDE PROGRAM STACK FOR DEBUG SYSTEM
; - ENTER DEBUG SYSTEM
; - RESTORE USER REGISTERS AND RETURN
;
DEBUG.: MOVE AC1 ,RGSTRS ;GET DEBUG-REGISTERS
MOVEI NEWREG ,DEBSIZE(AC1)
MOVEI BASIS ,20(AC1)
MOVEI TOPP ,1(BASIS)
PUSHJ TOPP ,DEBUG ;DEBUG
HRLZ 17 ,RGSTRS ;RESTORE USER-REGISTERS
BLT 17 ,17
POPJ TOPP ,
;
;*** FUNCTION SHRCOD
; - RETURN TRUE IF HIGH-SEGMENT IS
; SHARABLE, OTHERWISE FALSE
;
SHRCOD: HRROI AC1 ,.GTSGN ;SEE IF HGH SEGM. IS SH.
GETTAB AC1 , ; LOOK AT .GTSGN TABLE
HALT ;ERROR RETURN
LSH AC1 ,777736 ;SHIFT BIT 1 TO RIGHTMOST PLACE
ANDI AC1 ,1 ;CLEAR THE OTHER BITS
POPJ TOPP ,
;
;*** LITERALS
;
LIT
PRGEND
TITLE WRTFNM *** PROCEDURES WRTFNM AND WRTSIX ***
TWOSEG
;
;*** ENTRY-POINTS ***
;
ENTRY WRTFNM
ENTRY WRTSIX
;
;*** EXTERNAL REFERENCES ***
;
;
;*** REGISTER DEFINITION ***
;
AC0= 0
AC1= 1
REGIN= 1 ;INITILISATION OF REGISTERSTACK
REG= REGIN+1
REG1= REGIN+1+1
REG2= REGIN+1+2
REG3= REGIN+1+3
REG4= REGIN+1+4
REG5= REGIN+1+5
REG6= REGIN+1+6
NEWREG= 15
TOPP= 17
;
;*** DESCRIPTION OF PASCAL-FILEBLOCK (SEE PROCEDURE WRITEMC OF COMPILER) ***
;
FILPTR= 0
FILEOF= 1
FILEOL= 2
FILOPN= 3
FILLKP= 4
FILENT= 5
FILIN= 6
FILOUT= 7
FILCLS= 10
FILSTA= 11 ;.+0 FOR FILESTATUS
;.+1 FOR DEVICE
;.+2 FOR POINTER TO BUFFERHEADER
FILNAM= 14
FILEXT= 15
FILPRO= 16
FILPPN= 17
FILBFH= 20 ;BUFFER HEADER
FILBTP= 21 ;BYTE POINTER
FILBTC= 22 ;BYTE COUNT IN BUFFER
FILLNR= 23 ;IF ASCII MODE - LINENR IN ASCIICHARA
;CTERS
FILCNT= 24 ;LH= IF BINARY MODE : NEGATIVE NUMBE
;R OF WORDS IN COMPONENT
;IF ASCII MODE : CHARACTERCNT IN LIN
;E AND TAB INDICATOR
;RH= ADDRESS OF FIRST WORD IN COMPONE
;NT
FILCMP= 25 ;FIRST WORD OF COMPONENT
;
;*** START OF INVARIANT CODE ***
;
RELOC 400000
;
;*** PROCEDURES WRTFNM AND WRTSIX
; - WRITE CURRENT FILENAME(WRTFNM)
; - WRITE SIXBIT-STRING(WRTSIX)
; - <REG>=FILE-BLOCK
; - <REG1>=SIXBIT-STRING
; - REG2=LENGTH
;
WRTFNM: HRRI REG1 ,FILNAM(REG) ;ADDRESS OF FILENAME
MOVEI REG2 ,6 ;CHARACTER COUNT
WRTSIX: HRLI REG1 ,440600 ;SET UP BYTE POINTER
ILDB REG3 ,REG1 ;GET NEXT CHARACTER
ADDI REG3 ,40 ;CONVERT TO ASCII
OUTCHR REG3
SOJG REG2 ,.-3 ;MORE CHARACTERS ?
MOVEI REG3 ,56 ;INSERT PERIOD
OUTCHR REG3
MOVEI REG2 ,3 ;TYPE EXTENSION
ILDB REG3 ,REG1
ADDI REG3 ,40
OUTCHR REG3
SOJG REG2 ,.-3 ;ALL THREE BYTES TRANSFERRED ?
POPJ TOPP , ;RETURN
;
;*** LITERALS
;
LIT
PRGEND
TITLE TMPTST *** PROCEDURE TMPTST ***
TWOSEG
;
;*** ENTRY-POINTS ***
;
ENTRY TMPTST
;
;*** EXTERNAL REFERENCES ***
;
;
;*** REGISTER DEFINITION ***
;
AC0= 0
AC1= 1
REGIN= 1 ;INITILISATION OF REGISTERSTACK
REG= REGIN+1
REG1= REGIN+1+1
REG2= REGIN+1+2
REG3= REGIN+1+3
REG4= REGIN+1+4
REG5= REGIN+1+5
REG6= REGIN+1+6
NEWREG= 15
TOPP= 17
;
;*** DESCRIPTION OF PASCAL-FILEBLOCK (SEE PROCEDURE WRITEMC OF COMPILER) ***
;
FILPTR= 0
FILEOF= 1
FILEOL= 2
FILOPN= 3
FILLKP= 4
FILENT= 5
FILIN= 6
FILOUT= 7
FILCLS= 10
FILSTA= 11 ;.+0 FOR FILESTATUS
;.+1 FOR DEVICE
;.+2 FOR POINTER TO BUFFERHEADER
FILNAM= 14
FILEXT= 15
FILPRO= 16
FILPPN= 17
FILBFH= 20 ;BUFFER HEADER
FILBTP= 21 ;BYTE POINTER
FILBTC= 22 ;BYTE COUNT IN BUFFER
FILLNR= 23 ;IF ASCII MODE - LINENR IN ASCIICHARA
;CTERS
FILCNT= 24 ;LH= IF BINARY MODE : NEGATIVE NUMBE
;R OF WORDS IN COMPONENT
;IF ASCII MODE : CHARACTERCNT IN LIN
;E AND TAB INDICATOR
;RH= ADDRESS OF FIRST WORD IN COMPONE
;NT
FILCMP= 25 ;FIRST WORD OF COMPONENT
;
;*** START OF INVARIANT CODE ***
;
RELOC 400000
;
;*** PROCEDURE TMPTST
; - TEST IF FILE IS TEMPCORE-FILE
; - <REG>=FILE-BLOCK
;
TMPTST: PUSH TOPP ,AC1 ;SAVE AC1
MOVE AC1 ,FILSTA+1(REG) ;GET DEVICE MNEMONIC
CAME AC1 ,[SIXBIT/DSK /] ;IS IT DSK?
JRST OUT1 ;NO
HRL AC1 ,FILNAM(REG) ;RIGHTMOST 3 OF FILNAM
HLR AC1 ,FILEXT(REG) ;LEFTMOST 3 OF EXTENSION
CAMN AC1 ,[SIXBIT/ TMP/] ;TEMP-FILE?
JRST OUT ;YES - RETURN TO OLD PC
OUT1: MOVE AC1 ,-1(TOPP) ;NO - RETURN TO OLD PC+1
AOJ AC1 ,
MOVEM AC1 ,-1(TOPP)
OUT: POP TOPP ,AC1
POPJ TOPP ,
;
;*** LITERALS
;
LIT
PRGEND
TITLE ASTOSX *** PROCEDURE ASTOSX ***
TWOSEG
;
;*** ENTRY-POINTS ***
;
ENTRY ASTOSX
;
;*** EXTERNAL REFERENCES ***
;
;
;*** REGISTER DEFINITION ***
;
AC0= 0
AC1= 1
REGIN= 1 ;INITILISATION OF REGISTERSTACK
REG= REGIN+1
REG1= REGIN+1+1
REG2= REGIN+1+2
REG3= REGIN+1+3
REG4= REGIN+1+4
REG5= REGIN+1+5
REG6= REGIN+1+6
NEWREG= 15
TOPP= 17
;
;*** START OF INVARIANT CODE ***
;
RELOC 400000
;
;*** PROCEDURE ASTOSX
; - CONVERT ASCII- TO SIXBIT-STRING
; - <REG1>RH=ASCII-STRING
; - <AC1>RH=SIXBIT-STRING
; - REG5=LENGTH
;
ASTOSX: HRLI REG1 ,440700 ;SET UP BYTE POINTER TO PICK
;UP ASCII STRING
HRLI AC1 ,440600 ;
NXTBYT: ILDB AC0 ,REG1 ;GET BYTE
SUBI AC0 ,40 ;CONVERT TO SIXBIT
IDPB AC0 ,AC1
SOJG REG5 ,NXTBYT ;ALL BYTES TRANSFERRED ?
POPJ TOPP ,
;
;*** LITERALS ***
;
LIT
PRGEND
TITLE REAAUX *** PROCEDURES GETSGN, GETINT AND RTEST ***
TWOSEG
;
;*** ENTRY-POINTS ***
;
ENTRY GETSGN
ENTRY GETINT
ENTRY RTEST
;
;*** EXTERNAL REFERENCES ***
;
EXTERN GETCH
EXTERN CONERR
;
;*** REGISTER DEFINITION ***
;
AC0= 0
AC1= 1
REGIN= 1 ;INITILISATION OF REGISTERSTACK
REG= REGIN+1
REG1= REGIN+1+1
REG2= REGIN+1+2
REG3= REGIN+1+3
REG4= REGIN+1+4
REG5= REGIN+1+5
REG6= REGIN+1+6
NEWREG= 15
TOPP= 17
;
;*** DESCRIPTION OF PASCAL-FILEBLOCK (SEE PROCEDURE WRITEMC OF COMPILER) ***
;
FILPTR= 0
FILEOF= 1
FILEOL= 2
FILOPN= 3
FILLKP= 4
FILENT= 5
FILIN= 6
FILOUT= 7
FILCLS= 10
FILSTA= 11 ;.+0 FOR FILESTATUS
;.+1 FOR DEVICE
;.+2 FOR POINTER TO BUFFERHEADER
FILNAM= 14
FILEXT= 15
FILPRO= 16
FILPPN= 17
FILBFH= 20 ;BUFFER HEADER
FILBTP= 21 ;BYTE POINTER
FILBTC= 22 ;BYTE COUNT IN BUFFER
FILLNR= 23 ;IF ASCII MODE - LINENR IN ASCIICHARA
;CTERS
FILCNT= 24 ;LH= IF BINARY MODE : NEGATIVE NUMBE
;R OF WORDS IN COMPONENT
;IF ASCII MODE : CHARACTERCNT IN LIN
;E AND TAB INDICATOR
;RH= ADDRESS OF FIRST WORD IN COMPONE
;NT
FILCMP= 25 ;FIRST WORD OF COMPONENT
;
;*** START OF INVARIANT CODE ***
;
RELOC 400000
;
;*** PROCEDURES GETSGN, GETINT AND RTEST
; - AUXILIARY FUNCTIONS FOR FORMATTED READ
;
GTSGN: SKIPE FILEOF(REG) ;END-OF-FILE = TRUE
POPJ TOPP , ;YES- RETURN
PUSHJ TOPP ,GETCH ;GETS NEXT COMPONENT
GETSGN: MOVE AC0 ,FILCMP(REG) ;GETS FIRST COMPONENT
CAIE AC0 ," " ;LEADING BLANKS
CAIN AC0 ,"," ;AND LEADING COMMAS TOO
JRST GTSGN ;YES - OVERREAD THEM
SETZ REG2 , ;FOR INTEGER VALUE
SETZ REG3 , ;FOR SIGN
CAIN AC0 ,"+" ;FIRST COMPONENT EQUAL PLUS ?
JRST .+4 ;YES - GET NEXT COMPONENT
CAIE AC0 ,"-" ;FIRST COMPONENT EQUAL MINUS ?
POPJ TOPP , ;NO - RETURN
MOVEI REG3 ,1 ;YES - SET SIGN BIT
SKIPN FILEOL(REG) ;ENDOFLINE = TRUE ?
PUSHJ TOPP ,GETCH ;NO - GET NEXT COMPONENT
MOVE AC0 ,FILCMP(REG) ;FOR FOLLOWING PARTS TO AC0
POPJ TOPP ,
GETINT: JFCL 10 ,.+1 ;CLAERS FLAGS
GTINT: CAIG AC0 ,"9" ;COMPONENT IN DIGITS ?
CAIGE AC0 ,"0"
POPJ TOPP , ;NO - RETURN
SUBI AC0 ,"0" ;CONVERTS ASCII TO INTEGER
IMULI REG2 ,12 ;OLD INTEGER
ADD REG2 ,AC0 ;ADD NEW ONE
SKIPN FILEOL(REG) ;ENDOFLINE = TRUE ?
PUSHJ TOPP ,GETCH ;NO - GET NEXT COMPONENT
MOVE AC0 ,FILCMP(REG) ;AND GETS IT FOR FOLLOWING PARTS
JRST GTINT ;GET NEXT DIGIT IF ANY
RTEST: CAIG AC0 ,"9" ;CARACTER IN DIGITS ?
CAIGE AC0 ,"0"
JRST CONERR ;NO - WRITE ERROR MESSAGE AND EXIT
POPJ TOPP , ;YES - RETURN
;
;*** LITERALS ***
;
LIT
PRGEND
TITLE SETEOF *** PROCEDURE SETEOF ***
TWOSEG
;
;*** ENTRY-POINTS ***
;
ENTRY SETEOF
;
;*** EXTERNAL REFERENCES ***
;
;
;*** REGISTER DEFINITION ***
;
AC0= 0
AC1= 1
REGIN= 1 ;INITILISATION OF REGISTERSTACK
REG= REGIN+1
REG1= REGIN+1+1
REG2= REGIN+1+2
REG3= REGIN+1+3
REG4= REGIN+1+4
REG5= REGIN+1+5
REG6= REGIN+1+6
NEWREG= 15
TOPP= 17
;
;*** DESCRIPTION OF PASCAL-FILEBLOCK (SEE PROCEDURE WRITEMC OF COMPILER) ***
;
FILDAT= 1 ;FLAG TO TEST FOR TEXT-FILE
FILBIN= 17 ;FLAG TO TEST FOR ASCII-MODE
FILPTR= 0 ;LH= PASCAL FILE FLAGS
;RH= PTR TO COMPONENT
FILEOF= 1
FILEOL= 2
FILOPN= 3
FILLKP= 4
FILENT= 5
FILIN= 6
FILOUT= 7
FILCLS= 10
FILSTA= 11 ;.+0 FOR FILESTATUS
;.+1 FOR DEVICE
;.+2 FOR POINTER TO BUFFERHEADER
FILNAM= 14
FILEXT= 15
FILPRO= 16
FILPPN= 17
FILBFH= 20 ;BUFFER HEADER
FILBTP= 21 ;BYTE POINTER
FILBTC= 22 ;BYTE COUNT IN BUFFER
FILLNR= 23 ;IF ASCII MODE - LINENR IN ASCIICHARA
;CTERS
FILCNT= 24 ;LH= IF BINARY MODE : NEGATIVE NUMBE
;R OF WORDS IN COMPONENT
;IF ASCII MODE : CHARACTERCNT IN LIN
;E AND TAB INDICATOR
;RH= ADDRESS OF FIRST WORD IN COMPONE
;NT
FILCMP= 25 ;FIRST WORD OF COMPONENT
;
;*** CONSTANTS ***
;
MAXEOF= 10
;
;*** START OF INVARIANT CODE ***
;
RELOC 400000
;
;*** PROCEDURE SETEOF
; - SET UP EOF-COUNTER
; - SET EOLN, CLEAR CHAR-COUNTER
; - RETURN TO USER
; - <REG>=FILE-BLOCK
;
SETEOF: MOVNI AC0 ,MAXEOF ;INITIALIZE COUNT FOR
;MAXIMUM NUMBER OF ATTEMPTS
MOVEM AC0 ,FILEOF(REG) ;TO READ BEYOND EOF
MOVEI AC0 ," " ;INSERT BLANK
MOVEM AC0 ,FILCMP(REG) ;INTO FILE-COMPONENT
AOS FILEOL(REG) ;SET EOLN = TRUE
HLR AC0 ,FILPTR(REG) ;TEXT-FILE?
TRNN AC0 ,FILDAT ;SKIP IF NOT
HRRZS FILCNT(REG) ;CLEARS CHARACTERCNT
POPJ TOPP , ;RETURN
;
;*** LITERALS
;
LIT
PRGEND
TITLE WRTAUX *** PROCEDURES WRTBLK, TOOSML, WRTSGN AND WRTOPN ***
TWOSEG
;
;*** ENTRY-POINTS ***
;
ENTRY WRTBLK
ENTRY TOOSML
ENTRY WRTOPN
ENTRY WRTSGN
;
;*** EXTERNAL REFERENCES ***
;
EXTERN PUTCH
;
;*** REGISTER DEFINITION ***
;
AC0= 0
AC1= 1
REGIN= 1 ;INITILISATION OF REGISTERSTACK
REG= REGIN+1
REG1= REGIN+1+1
REG2= REGIN+1+2
REG3= REGIN+1+3
REG4= REGIN+1+4
REG5= REGIN+1+5
REG6= REGIN+1+6
NEWREG= 15
TOPP= 17
;
;*** START OF INVARIANT CODE ***
;
RELOC 400000
;
;*** PROCEDURES WRTBLK, WRTSGN, WRTOPN AND TOOSML
; - AUXLIARY FUNCTIONS FOR FORMATTED WRITE
;
WRTBLK: JUMPLE REG2 ,.+4 ;WRITES BLANKES OUT
MOVEI AC0 ," "
PUSHJ TOPP ,PUTCH
SOJG REG2 ,.-1 ;COUNT EQUAL ZERO?
POPJ TOPP , ;YES - RETURN
WRTOPN: MOVEI REG5 ,(REG2) ;SAVES FORMAT BECAUSE REG2 IS USED FOR
;IDIVI-INSTRUCTION
SETZ REG4 , ;RH - COUNT OF DIGITS ON PUSH-LIST
;LH - EQ 400000 IF SIGN = '-'
JUMPGE REG1 ,OUT ;NEGATIV NUMBER?
TLO REG4 ,400000 ;YES - SET SIGN MARKER
TLNE REG1 ,377777 ;LH = 400000?
JRST OK ;NO - GET MAGNITUDE
TRNN REG1 ,777777 ;RH = 000000?
JRST TOOSM1 ;FOR 400000000000B ONLY OCTAL
OK: SUBI REG5 ,1 ;ONE PLACE IN FORMAT USE FOR SIGN
MOVM REG1 ,REG1
OUT: POPJ TOPP ,
WRTSGN: TLZN REG4 ,400000 ;SIGN EQUAL '-'?
POPJ TOPP , ;NO - RETURN
MOVEI AC0 ,"-" ;YES
JRST PUTCH ;PUTCH RETURNS OVER PUT
TOOSM1: POP TOPP ,AC0 ;DIRECT RETURN TO USER
TOOSML: MOVEI AC0 ,"*" ;FORMAT IS TOO SMALL
PUSHJ TOPP ,PUTCH
SOJG REG5 ,.-1
POPJ TOPP , ;RETURNS OUT OF WRITE-ROUTINE
;
;*** LITERALS
;
LIT
PRGEND
TITLE FORER. *** PROCEDURE FORER. ***
TWOSEG
;
;*** ENTRY-POINTS ***
;
ENTRY FORER.
;
;*** START OF INVARIANT CODE ***
;
RELOC 400000
;
;*** FORTRAN ERROR-EXIT
;
FORER.: OUTSTR [ASCIZ/
%? ERROR IN FORTRAN PROCEDURE/]
EXIT
;
;*** LITERALS ***
;
LIT
PRGEND
END